diff --git a/.codacy.yaml b/.codacy.yaml index 478781d09..e55144484 100644 --- a/.codacy.yaml +++ b/.codacy.yaml @@ -1,12 +1,13 @@ exclude_paths: - - 'deprecated/**' - - 'mac/libusb/**' - - 'reference/**' - - 'shapelib/**' - - 'strptime/**' - - 'zlib/**' - - coverity_model.cc - - jeeps/gpsproj.cc - - jeeps/gpsproj.h - - tools/qtci/README.md - - tools/uploadtool/README.md + - "coverity_model.cc" + - "deprecated/**" + - "gui/coretool/gpsbabel_*.ts" + - "gui/gpsbabelfe_*.ts" + - "jeeps/gpsproj.cc" + - "jeeps/gpsproj.h" + - "mac/libusb/**" + - "reference/**" + - "shapelib/**" + - "strptime/**" + - "tools/uploadtool/README.md" + - "zlib/**" diff --git a/.github/workflows/codacy-analysis.yaml b/.github/workflows/codacy-analysis.yaml index 8ae2c2b20..1a33418ba 100644 --- a/.github/workflows/codacy-analysis.yaml +++ b/.github/workflows/codacy-analysis.yaml @@ -16,8 +16,8 @@ jobs: fail-fast: false matrix: include: - - IMAGE: 'jammy' - CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt5' + - IMAGE: 'noble' + CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' SCRIPT: './tools/ci_run_tidy.sh' container: image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_${{ matrix.IMAGE }} @@ -29,7 +29,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: build_and_test run: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 079144551..614f9ef20 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -8,16 +8,14 @@ # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. -# ******** NOTE ******** - +# name: "CodeQL" on: push: - branches: [ master ] + branches: [ "master" ] pull_request: - # The branches below must be a subset of the branches above - branches: [ master ] + branches: [ "master" ] schedule: - cron: '27 4 * * 2' workflow_dispatch: ~ @@ -25,50 +23,62 @@ on: jobs: analyze: name: Analyze + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners + # Consider using larger runners for possible analysis time improvements. runs-on: ubuntu-latest + timeout-minutes: 360 + permissions: + actions: read + contents: read + security-events: write container: - image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_focal + image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_jammy env: CMAKE_GENERATOR: Ninja strategy: fail-fast: false matrix: - # language: [ 'cpp', 'javascript' ] - language: [ 'cpp' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + language: [ 'c-cpp' ] + # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] + # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. #- run: | - # make bootstrap - # make release + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/fedora.yml b/.github/workflows/fedora.yml index 643d0c2c5..f8a2aa553 100644 --- a/.github/workflows/fedora.yml +++ b/.github/workflows/fedora.yml @@ -13,19 +13,14 @@ jobs: strategy: fail-fast: false matrix: - # version 32, though obsolete, uses Qt 5.14 so we keep it for that. include: - - IMAGE: '32' - CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt5' - - IMAGE: '35' - CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt5' - - IMAGE: '37' - CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt5' - IMAGE: '37' CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt6' - IMAGE: '38' - CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt5' - - IMAGE: '38' + CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt6' + - IMAGE: '39' + CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt6' + - IMAGE: '40' CMAKE_PREFIX_PATH: '/usr/lib64/cmake/Qt6' container: image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_f${{ matrix.IMAGE }} @@ -35,7 +30,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: build_and_test run: | diff --git a/.github/workflows/gendocs.yml b/.github/workflows/gendocs.yml new file mode 100644 index 000000000..a6b64fb8a --- /dev/null +++ b/.github/workflows/gendocs.yml @@ -0,0 +1,59 @@ +name: "gendocs" + +on: + push: + branches: [ master ] + schedule: + - cron: '27 4 * * 2' + workflow_dispatch: + inputs: + docversion: + required: false + type: string + default: 'development' + +jobs: + ubuntu: + name: ubuntu Build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - IMAGE: 'jammy' + CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' + SCRIPT: './tools/build_and_test_cmake.sh' + RELEASE: true + container: + image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_${{ matrix.IMAGE }} + env: + LC_ALL: 'C.UTF-8' + JOB_CMAKE_PREFIX_PATH: ${{ matrix.CMAKE_PREFIX_PATH }} + JOB_SCRIPT: ${{ matrix.SCRIPT }} + JOB_DOCVERSION: ${{ inputs.docversion }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: build_and_test + run: | + # when using containers manually whitelist the checkout directory to allow git commands to work + git config --global --add safe.directory "${GITHUB_WORKSPACE}" + if [ -n "${JOB_CMAKE_PREFIX_PATH}" ]; then + CMAKE_PREFIX_PATH="${JOB_CMAKE_PREFIX_PATH}" + export CMAKE_PREFIX_PATH + fi + "${JOB_SCRIPT}" "${JOB_DOCVERSION:-development}" + + - name: 'Upload Artifacts' + if: matrix.RELEASE + uses: actions/upload-artifact@v4 + with: + name: Documents + path: | + gpsbabel.org/ + gpsbabel.pdf + gpsbabel.html + docbook.css + retention-days: 7 diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 300948e4f..7a143ac06 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -18,33 +18,33 @@ jobs: fail-fast: false matrix: include: - - QT_VERSION: '5.15.2' - XCODE_VERSION: '12.5.1' - GENERATOR: 'Ninja' - RELEASE: false - os: macos-11 - QT_VERSION: '6.2.4' XCODE_VERSION: '13.4.1' - GENERATOR: 'Xcode' + GENERATOR: 'Ninja' RELEASE: false os: macos-12 - QT_VERSION: '6.2.4' - XCODE_VERSION: '13.4.1' - GENERATOR: 'Ninja' - RELEASE: true - os: macos-12 - - QT_VERSION: '6.5.2' - XCODE_VERSION: '14.2' + XCODE_VERSION: '14.3.1' GENERATOR: 'Ninja' RELEASE: false - os: macos-12 + os: macos-13 + - QT_VERSION: '6.5.3' + XCODE_VERSION: '15.4' + GENERATOR: 'Xcode' + RELEASE: false + os: macos-14 + - QT_VERSION: '6.5.3' + XCODE_VERSION: '15.4' + GENERATOR: 'Ninja' + RELEASE: true + os: macos-14 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Cache Qt - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache with: path: ~/Cache @@ -52,16 +52,16 @@ jobs: - name: Qt install setup if: steps.cache.outputs.cache-hit != 'true' - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.12' - name: Qt install if: steps.cache.outputs.cache-hit != 'true' env: - TRAVIS_BUILD_DIR: ${{ github.workspace }} + CI_BUILD_DIR: ${{ github.workspace }} run: | - ./tools/travis_install_osx ${{ matrix.QT_VERSION }} aqt + ./tools/ci_install_osx.sh ${{ matrix.QT_VERSION }} aqt - name: Brew install if: matrix.GENERATOR == 'Ninja' @@ -73,13 +73,22 @@ jobs: # https://github.com/actions/runner-images/issues/6507 # https://github.com/actions/runner-images/issues/2322 # brew update # skip update for now to avoid link issues AND many slow dependency upGRADES. + brew list -1 | grep python + ls -l $(brew --prefix)/bin | grep -i python + # workaround for https://github.com/actions/setup-python/issues/577 + brew list -1 | grep python | while read formula; do brew unlink $formula; brew link --overwrite $formula; done + brew list -1 | grep python + ls -l $(brew --prefix)/bin | grep -i python brew install ninja brew install docbook docbook-xsl fop gnu-sed - brew install jing-trang + # brew install is taking forever on macos-11, skip jing-trang and all it's dependencies. + if [ "${{ matrix.os }}" != "macos-11" ]; then + brew install jing-trang + fi - name: Script env: - XML_CATALOG_FILES: /usr/local/etc/xml/catalog + XML_CATALOG_FILES: ${{ runner.arch == 'ARM64' && '/opt/homebrew/etc/xml/catalog' || '/usr/local/etc/xml/catalog' }} run: | source ${HOME}/Cache/qt-${{ matrix.QT_VERSION }}.env sudo xcode-select --switch /Applications/Xcode_${{ matrix.XCODE_VERSION }}.app @@ -97,7 +106,7 @@ jobs: ./tools/uploadtool/upload_github.sh gui/GPSBabel-*.dmg - name: 'Upload Artifacts' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: MacOS_Installer ${{ join(matrix.*) }} path: gui/GPSBabel-*.dmg diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index e5754277b..0e18db517 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -18,20 +18,25 @@ jobs: fail-fast: false matrix: include: - - IMAGE: 'focal' - SCRIPT: './tools/build_and_test_cmake.sh' + # focal has Qt 5.12, end of standard support 4/2025, end of life 4/2030. + #- IMAGE: 'focal' + # SCRIPT: './tools/build_and_test_cmake.sh' - IMAGE: 'jammy' - CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt5' + CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' SCRIPT: './tools/build_and_test_cmake.sh' - IMAGE: 'jammy' CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' SCRIPT: './tools/build_and_test_cmake.sh' - - IMAGE: 'jammy' + TOOLS: 'clang' + - IMAGE: 'noble' + CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' + SCRIPT: './tools/build_and_test_cmake.sh' + - IMAGE: 'noble' CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' SCRIPT: './tools/build_and_test_cmake.sh' TOOLS: 'clang' - IMAGE: 'jammy' - CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt5' + CMAKE_PREFIX_PATH: '/usr/lib/x86_64-linux-gnu/cmake/Qt6' SCRIPT: './tools/build_extra_tests.sh' container: image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_${{ matrix.IMAGE }} @@ -43,7 +48,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: build_and_test run: | @@ -63,15 +68,15 @@ jobs: coverage: name: coverage Build - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - name: install run: | sudo apt-get update - sudo apt-get install gcovr lcov libusb-1.0-0-dev qt5-default qtwebengine5-dev libqt5serialport5-dev ninja-build + sudo apt-get install gcovr lcov libusb-1.0-0-dev libgl-dev qt6-base-dev libqt6core5compat6-dev libqt6serialport6-dev qt6-webengine-dev qt6-webengine-dev-tools ninja-build - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: script env: @@ -86,7 +91,7 @@ jobs: snap-file: ${{ steps.build-snap.outputs.snap }} steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Build uses: snapcore/action-build@v1 @@ -112,7 +117,7 @@ jobs: ./tools/uploadtool/upload_github.sh ${{ steps.build-snap.outputs.snap }} - name: Upload Artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ steps.build-snap.outputs.snap }} path: ${{ steps.build-snap.outputs.snap }} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index ee1452cf9..b37a74a0d 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -19,35 +19,11 @@ jobs: fail-fast: false matrix: include: - - QT_VERSION: '5.12.12' - ARCH: 'amd64' - HOST_ARCH: 'amd64' - COMPILER: 'msvc2017_64' - METHOD: 'aqt' - GENERATOR: 'Visual Studio 16 2019' - RELEASE: false - os: windows-2019 - - QT_VERSION: '5.12.12' - ARCH: 'amd64' - HOST_ARCH: 'amd64' - COMPILER: 'msvc2017_64' - TOOLSET: 'v141,version=14.16.27023' - METHOD: 'aqt' - GENERATOR: 'Visual Studio 16 2019' - RELEASE: false - os: windows-2019 - - QT_VERSION: '5.12.12' - ARCH: 'x86' - HOST_ARCH: 'amd64' - COMPILER: 'msvc2017' - METHOD: 'aqt' - GENERATOR: 'Visual Studio 16 2019' - RELEASE: false - os: windows-2019 - QT_VERSION: '6.2.4' ARCH: 'amd64' HOST_ARCH: 'amd64' COMPILER: 'msvc2019_64' + TOOLSET: 'v142,version=14.29.30133' METHOD: 'aqt' GENERATOR: 'Visual Studio 16 2019' RELEASE: false @@ -60,7 +36,7 @@ jobs: GENERATOR: 'Visual Studio 17 2022' RELEASE: false os: windows-latest - - QT_VERSION: '6.5.2' + - QT_VERSION: '6.5.3' ARCH: 'amd64' HOST_ARCH: 'amd64' COMPILER: 'msvc2019_64' @@ -71,10 +47,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Cache Qt - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache with: path: ~/Cache @@ -82,7 +58,7 @@ jobs: - name: Install Qt setup(aqt) if: steps.cache.outputs.cache-hit != 'true' - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.9' @@ -126,7 +102,7 @@ jobs: ./tools/uploadtool/upload_github.sh bld/gui/GPSBabel-*-Setup.exe - name: 'Upload Artifacts' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Windows_Installer ${{ join(matrix.*) }} path: | diff --git a/.gitignore b/.gitignore index 8da97ca49..0aecc86f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,53 +1,65 @@ +*.a +*.cbp +*.o +*.swo +.ninja_deps +.ninja_log +.qmake.cache +.qmake.stash +.qt +/*.gcda +/*.gcno +/*.gcov +/.cmake/ +/.idea/ +/.vs/ +/.vscode/ +/GPSBabel +/GPSBabel[0-9]*.[0-9]*.[0-9]*.tar.bz2 +/GPSBabel[0-9]*.[0-9]*.[0-9]*/ +/Makefile +/autogen/ /autom4te.cache/ /babelweb/ /bld/ +/bld-clazy/ +/bld-sanitizeaddress/ +/bld-sanitizeundefined/ +/bld-tidy/ /build/ +/codacy-clang-tidy /compile_commands.json +/config.tests/ /config.h /config.log /config.status /cscope.out /debug/ +/empty +/gbversion.h /gpsbabel /gpsbabel-debug /gpsbabel.exe /gpsbabel.fo +/gpsbabel.gch/ /gpsbabel.html /gpsbabel.pdf +/gpsbabel.rc /gpsbabel_autogen/ /gpsbabel_coverage.xml -/Makefile -.qmake.cache -.qmake.stash -/GPSBabel -/*.gcda -/*.gcno -/*.gcov -*.o -*.a -.ninja_deps -.ninja_log -.qt -build.ninja -rules.ninja -cmake_install.cmake -CMakeCache.txt -CMakeFiles/ -CTestTestfile.cmake -/GPSBabel[0-9]*.[0-9]*.[0-9]*/ -/GPSBabel[0-9]*.[0-9]*.[0-9]*.tar.bz2 +/makedoc /makelinuxdist.sh +/mkcapabilities /objects/ +/out/ +/qrc_gpsbabel.cpp /release/ -*.swp +/run-clang-tidy-nocolor /tmp/ -/mkcapabilities -/gpsbabel.gch/ -/gpsbabel.rc -/autogen/ -/makedoc -/empty -/gbversion.h -/qrc_gpsbabel.cpp -/.vscode/ +CMakeCache.txt +CMakeFiles/ +CTestTestfile.cmake Testing +build.ninja +cmake_install.cmake +rules.ninja diff --git a/CMakeLists.txt b/CMakeLists.txt index 28d131c5c..2193b851b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.11) +cmake_minimum_required(VERSION 3.16) include(CMakeDependentOption) include(CheckIncludeFile) @@ -6,7 +6,7 @@ include(CheckIncludeFile) include(gbversion.cmake) project(gpsbabel LANGUAGES C CXX VERSION ${GB.VERSION}) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) # Do this after we set up common variables but before creating other @@ -26,17 +26,12 @@ set(CMAKE_AUTORCC ON) add_executable(gpsbabel) # Find the QtCore library -find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) -find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) -list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Core) -if(${Qt${QT_VERSION_MAJOR}Core_VERSION} VERSION_LESS 5.12) - message(FATAL_ERROR "Qt version ${Qt${QT_VERSION_MAJOR}Core_VERSION} found, but version 5.12 or newer is required.") +find_package(Qt6 REQUIRED COMPONENTS Core Core5Compat) +list(APPEND QT_LIBRARIES Qt6::Core Qt6::Core5Compat) +if(${Qt6Core_VERSION} VERSION_LESS 6.2) + message(FATAL_ERROR "Qt version ${Qt6Core_VERSION} found, but version 6.2 or newer is required.") else() - message(STATUS "Using Qt${QT_VERSION_MAJOR} version ${Qt${QT_VERSION_MAJOR}Core_VERSION}") -endif() -if(${QT_VERSION_MAJOR} EQUAL "6") - find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core5Compat REQUIRED) - list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Core5Compat) + message(STATUS "Using Qt6 version ${Qt6Core_VERSION}") endif() option(GPSBABEL_ENABLE_PCH "enable precompiled headers." ON) @@ -153,7 +148,7 @@ set(JEEPS jeeps/gpsusbcommon.cc jeeps/gpsusbread.cc jeeps/gpsusbsend.cc - jeeps/jgpsutil.cc + jeeps/gpsutil.cc ) # SUPPORT @@ -174,6 +169,7 @@ set(SUPPORT rgbcolors.cc route.cc session.cc + src/core/codecdevice.cc src/core/logging.cc src/core/nvector.cc src/core/textstream.cc @@ -187,9 +183,6 @@ set(SUPPORT waypt.cc xmlgeneric.cc ) -if(${QT_VERSION_MAJOR} EQUAL "6") - set(SUPPORT ${SUPPORT} src/core/codecdevice.cc) -endif() # HEADERS set(HEADERS @@ -201,6 +194,7 @@ set(HEADERS filter_vecs.h format.h formspec.h + garmin.h garmin_fit.h garmin_fs.h garmin_gpi.h @@ -209,6 +203,8 @@ set(HEADERS gbfile.h gbser.h gbser_private.h + garmin_txt.h + garmin_xt.h gdb.h geocache.h geojson.h @@ -217,17 +213,20 @@ set(HEADERS googletakeout.h gpx.h grtcirc.h + gtm.h gtrnctr.h heightgrid.h humminbird.h html.h inifile.h kml.h - legacyformat.h igc.h lowranceusr.h + mkshort.h + mtk_logger.h nmea.h osm.h + ozi.h qstarz_bl_1000.h random.h session.h @@ -235,8 +234,12 @@ set(HEADERS skytraq.h subrip.h text.h + tpg.h + tpo.h unicsv.h units.h + v900.h + vcf.h vecs.h xcsv.h xmlgeneric.h @@ -246,7 +249,6 @@ set(HEADERS jeeps/gpscom.h jeeps/gpsdatum.h jeeps/gpsdevice.h - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsport.h @@ -258,6 +260,7 @@ set(HEADERS jeeps/gpsusbcommon.h jeeps/gpsusbint.h jeeps/gpsutil.h + src/core/codecdevice.h src/core/datetime.h src/core/file.h src/core/logging.h @@ -268,9 +271,6 @@ set(HEADERS src/core/xmlstreamwriter.h src/core/xmltag.h ) -if(${QT_VERSION_MAJOR} EQUAL "6") - set(HEADERS ${HEADERS} src/core/codecdevice.h) -endif() string(REPLACE .cc .h FILTER_HEADERS "${FILTERS}") set(HEADERS ${HEADERS} ${FILTER_HEADERS}) @@ -283,9 +283,7 @@ endif() if(WIN32) target_compile_definitions(gpsbabel PRIVATE __WIN32__) - if(${QT_VERSION_MAJOR} EQUAL "6") - qt_disable_unicode_defines(gpsbabel) - endif() + qt_disable_unicode_defines(gpsbabel) if(CMAKE_BUILD_TYPE STREQUAL Debug) target_compile_definitions(gpsbabel PRIVATE _DEBUG) endif() @@ -342,7 +340,6 @@ target_sources(gpsbabel PRIVATE ${SOURCES} ${HEADERS}) # We don't care about stripping things out of the build. Full monty, baby. target_compile_definitions(gpsbabel PRIVATE MAXIMAL_ENABLED) target_compile_definitions(gpsbabel PRIVATE FILTERS_ENABLED) -target_compile_definitions(gpsbabel PRIVATE SHAPELIB_ENABLED) target_compile_definitions(gpsbabel PRIVATE CSVFMTS_ENABLED) target_link_libraries(gpsbabel PRIVATE ${QT_LIBRARIES} ${LIBS}) @@ -396,6 +393,7 @@ set(TESTS kml-read kml lowranceusr + mkshort mtk multiurlgpx nmea @@ -475,9 +473,9 @@ endif() get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if((CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) AND NOT _isMultiConfig) - set(WEB "gpsbabel.org" CACHE PATH "Path where the documentation will be stored for www.gpsbabel.org.") + set(GPSBABEL_WEB "gpsbabel.org" CACHE PATH "Path where the documentation will be stored for www.gpsbabel.org.") add_custom_target(gpsbabel.org - ${CMAKE_SOURCE_DIR}/tools/make_gpsbabel_org.sh ${WEB} ${DOCVERSION} + ${CMAKE_SOURCE_DIR}/tools/make_gpsbabel_org.sh ${GPSBABEL_WEB} ${GPSBABEL_DOCVERSION} DEPENDS gpsbabel gpsbabel.pdf VERBATIM USES_TERMINAL) diff --git a/INSTALL b/INSTALL index d2de7f464..8fe983de6 100644 --- a/INSTALL +++ b/INSTALL @@ -71,16 +71,16 @@ GPSBABEL_EXTRA_LINK_LIBRARIES:STRING GPSBABEL_EXTRA_LINK_OPTIONS:STRING Extra link options when building the target gpsbabel. -DOCVERSION:STRING=... +GPSBABEL_DOCVERSION:STRING=... string appended to documentation location for www.gpsbabel.org. The default value is the version string, e.g. "1.7.0". This is used by the gpsbabel.org target, you are unlikely to need it unless you are maintaining www.gpsbabel.org. -WEB:STRING=DIR +GPSBABEL_WEB:STRING=DIR Path where the documentation will be stored for www.gpsbabel.org. This is used by the gpsbabel.org target, you are unlikely to need it unless you are - maintaining www.gpsbabel.org. The default location is "../babelweb" + maintaining www.gpsbabel.org. The default location is "gpsbabel.org". Targets: @@ -104,6 +104,5 @@ On non-macOS unix builds by default we now compile in the gpsbabel generated translation files, i.e. gpsbabelfe_*.qm, gpsbabel_*.qm, as well as gmapbase.html. When compiled in these files do not need to be distributed. These are used by the GUI. Additional translation files from Qt will also be -used if they are found. They may be in a package such as qttranslations5-l10n -or qt5-qttranslations. +used if they are found. They may be in a package such as qt6-translations-l10n. diff --git a/README.md b/README.md index 3aeabed79..8a2a957ec 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Passing is good. We like passing. The latest official release is available at http://www.gpsbabel.org/download.html. -We are proud of our rating on Codacy: [![Codacy Badge](https://app.codacy.com/project/badge/Grade/b87af2d47325425cbaeea5805eff2c6b)](https://www.codacy.com/gh/GPSBabel/gpsbabel/dashboard?utm_source=github.com&utm_medium=referral&utm_content=GPSBabel/gpsbabel&utm_campaign=Badge_Grade) +We are proud of our rating on Codacy: [![Codacy Badge](https://app.codacy.com/project/badge/Grade/b87af2d47325425cbaeea5805eff2c6b)](https://app.codacy.com/gh/GPSBabel/gpsbabel/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) If you aren't a programmer or a writer, we need help with gear, hosting costs, tool license prices, answering questions on the mailing lists, etc. Please [support GPSBabel](https://www.gpsbabel.org/contribute.html) any way you can. diff --git a/arcdist.cc b/arcdist.cc index 55a33c887..d213222d6 100644 --- a/arcdist.cc +++ b/arcdist.cc @@ -44,8 +44,7 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) { static const Waypoint* arcpt1 = nullptr; - double prjlat; - double prjlon; + PositionDeg prjpos; double frac; if (arcpt2 && arcpt2->latitude != BADVAL && arcpt2->longitude != BADVAL && @@ -62,12 +61,8 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) if (ed->distance == BADVAL || projectopt || ed->distance >= pos_dist) { double dist; if (ptsopt) { - dist = gcdist(RAD(arcpt2->latitude), - RAD(arcpt2->longitude), - RAD(waypointp->latitude), - RAD(waypointp->longitude)); - prjlat = arcpt2->latitude; - prjlon = arcpt2->longitude; + dist = gcdist(arcpt2->position(), waypointp->position()); + prjpos = arcpt2->position(); frac = 1.0; } else { if (waypointp == nullptr) { @@ -77,13 +72,9 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) fatal(FatalMsg() << "Internal error: Attempt to project waypoint without predecessor"); } - dist = linedistprj(arcpt1->latitude, - arcpt1->longitude, - arcpt2->latitude, - arcpt2->longitude, - waypointp->latitude, - waypointp->longitude, - &prjlat, &prjlon, &frac); + std::tie(dist, prjpos, frac) = linedistprj(arcpt1->position(), + arcpt2->position(), + waypointp->position()); } /* convert radians to float point statute miles */ @@ -92,8 +83,7 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) if (ed->distance > dist) { ed->distance = dist; if (projectopt) { - ed->prjlatitude = prjlat; - ed->prjlongitude = prjlon; + ed->prjpos = prjpos; ed->frac = frac; ed->arcpt1 = arcpt1; ed->arcpt2 = arcpt2; @@ -106,7 +96,7 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) arcpt1 = arcpt2; } -void ArcDistanceFilter::arcdist_arc_disp_hdr_cb(const route_head*) +void ArcDistanceFilter::arcdist_arc_disp_hdr_cb(const route_head* /*unused*/) { /* Set arcpt1 to NULL */ arcdist_arc_disp_wpt_cb(nullptr); @@ -171,8 +161,7 @@ void ArcDistanceFilter::process() wp->wpt_flags.marked_for_deletion = 1; removed++; } else if (projectopt) { - wp->longitude = ed->prjlongitude; - wp->latitude = ed->prjlatitude; + wp->SetPosition(ed->prjpos); if (!arcfileopt && (ed->arcpt2->altitude != unknown_alt) && (ptsopt || (ed->arcpt1->altitude != unknown_alt))) { diff --git a/arcdist.h b/arcdist.h index 842fb12f4..7e30e4e70 100644 --- a/arcdist.h +++ b/arcdist.h @@ -44,8 +44,7 @@ class ArcDistanceFilter:public Filter struct extra_data { double distance; - double prjlatitude; - double prjlongitude; + PositionDeg prjpos; double frac; const Waypoint* arcpt1; const Waypoint* arcpt2; @@ -54,7 +53,7 @@ class ArcDistanceFilter:public Filter /* Member Functions */ void arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2); - void arcdist_arc_disp_hdr_cb(const route_head*); + void arcdist_arc_disp_hdr_cb(const route_head* /*unused*/); /* Data Members */ diff --git a/bend.cc b/bend.cc index 1bfb7060e..09325673f 100644 --- a/bend.cc +++ b/bend.cc @@ -22,12 +22,14 @@ #include // macos wants abs from here! #include // for strtod, abs +#include // for as_const #include // for QString -#include // for qAsConst, QAddConst<>::Type, foreach +#include // for QForeachContainer, qMakeForeachContainer, foreach #include "defs.h" #include "bend.h" +#include "formspec.h" // for FormatSpecificDataList #include "grtcirc.h" // for RAD, heading_true_degrees, gcdist, linepart, radtometers, DEG @@ -51,38 +53,30 @@ void BendFilter::init() route_flush_all_routes(); } -Waypoint* BendFilter::create_wpt_dest(const Waypoint* wpt_orig, double lat_orig, - double long_orig, double lat_orig_adj, double long_orig_adj) const +Waypoint* BendFilter::create_wpt_dest(const Waypoint* wpt_orig, const Waypoint* wpt_orig_adj) const { - double distance = gcdist(lat_orig, long_orig, - lat_orig_adj, long_orig_adj); - double lat_dest; - double long_dest; - distance = radtometers(distance); + double distance = radtometers(gcdist(wpt_orig->position(), + wpt_orig_adj->position())); if (distance <= maxDist) { return nullptr; } double frac = maxDist / distance; - linepart(lat_orig, long_orig, lat_orig_adj, long_orig_adj, frac, - &lat_dest, &long_dest); - auto* wpt_dest = new Waypoint(*wpt_orig); - wpt_dest->latitude = DEG(lat_dest); - wpt_dest->longitude = DEG(long_dest); + wpt_dest->SetPosition(linepart(wpt_orig->position(), wpt_orig_adj->position(), frac)); return wpt_dest; } -int BendFilter::is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, - double long_orig_prev, double lat_orig_next, - double long_orig_next) const +int BendFilter::is_small_angle(const Waypoint* wpt_orig, + const Waypoint* wpt_orig_prev, + const Waypoint* wpt_orig_next) const { - double heading_prev = heading_true_degrees(lat_orig, long_orig, - lat_orig_prev, long_orig_prev); - double heading_next = heading_true_degrees(lat_orig, long_orig, - lat_orig_next, long_orig_next); + double heading_prev = heading_true_degrees(wpt_orig->position(), + wpt_orig_prev->position()); + double heading_next = heading_true_degrees(wpt_orig->position(), + wpt_orig_next->position()); double heading_diff = heading_next - heading_prev; @@ -104,28 +98,17 @@ void BendFilter::process_route(const route_head* route_orig, route_head* route_d route_add_wpt(route_dest, waypoint_dest); } } else { - double lat_orig = RAD(wpt_orig->latitude); - double long_orig = RAD(wpt_orig->longitude); - - double lat_orig_prev = RAD(wpt_orig_prev->latitude); - double long_orig_prev = RAD(wpt_orig_prev->longitude); - - double lat_orig_next = RAD(wpt_orig_next->latitude); - double long_orig_next = RAD(wpt_orig_next->longitude); - if (is_small_angle(lat_orig, long_orig, lat_orig_prev, - long_orig_prev, lat_orig_next, long_orig_next)) { + if (is_small_angle(wpt_orig, wpt_orig_prev, wpt_orig_next)) { auto* waypoint_dest = new Waypoint(*wpt_orig); route_add_wpt(route_dest, waypoint_dest); } else { - Waypoint* wpt_dest_prev = create_wpt_dest(wpt_orig, - lat_orig, long_orig, lat_orig_prev, long_orig_prev); + Waypoint* wpt_dest_prev = create_wpt_dest(wpt_orig, wpt_orig_prev); if (wpt_dest_prev != nullptr) { route_add_wpt(route_dest, wpt_dest_prev); } - Waypoint* wpt_dest_next = create_wpt_dest(wpt_orig, - lat_orig, long_orig, lat_orig_next, long_orig_next); + Waypoint* wpt_dest_next = create_wpt_dest(wpt_orig, wpt_orig_next); if (wpt_dest_next != nullptr) { route_add_wpt(route_dest, wpt_dest_next); @@ -159,7 +142,7 @@ void BendFilter::process_route_orig(const route_head* route_orig) void BendFilter::process() { - for (const auto* route_orig : qAsConst(*routes_orig)) { + for (const auto* route_orig : std::as_const(*routes_orig)) { process_route_orig(route_orig); } } diff --git a/bend.h b/bend.h index a87d8c758..69cc59c70 100644 --- a/bend.h +++ b/bend.h @@ -61,11 +61,10 @@ class BendFilter:public Filter }, }; - Waypoint* create_wpt_dest(const Waypoint* wpt_orig, double lat_orig, - double long_orig, double lat_orig_adj, double long_orig_adj) const; - int is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, - double long_orig_prev, double lat_orig_next, - double long_orig_next) const; + Waypoint* create_wpt_dest(const Waypoint* wpt_orig, const Waypoint* wpt_adj) const; + int is_small_angle(const Waypoint* wpt_orig, + const Waypoint* wpt_orig_prev, + const Waypoint* wpt_orig_next) const; void process_route(const route_head* route_orig, route_head* route_dest); void process_route_orig(const route_head* route_orig); diff --git a/csv_util.cc b/csv_util.cc index 373e35556..0fde1d128 100644 --- a/csv_util.cc +++ b/csv_util.cc @@ -20,7 +20,6 @@ */ -#include // for assert #include // for fabs #include // for strtod #include // for strlen, strchr, strncmp, strcmp, memmove, strcpy, strcspn, strncpy @@ -28,7 +27,7 @@ #include // for QByteArray #include // for QChar #include // for QDebug -#include // for QRegularExpression +#include // for QList #include // for QString, operator+ #include "defs.h" @@ -49,12 +48,10 @@ csv_stringclean(const QString& source, const QString& to_nuke) { QString r = source; if (!to_nuke.isEmpty()) { - // avoid problematic regular rexpressions, e.g. xmapwpt generated [:\n:], - // or one can imagine [0-9] when we meant the characters, '0', '-', and '9', - // or one can imagine [^a] when we meant the characters '^' and 'a'. - QRegularExpression regex = QRegularExpression(QStringLiteral("[%1]").arg(QRegularExpression::escape(to_nuke))); - assert(regex.isValid()); - r.remove(regex); + auto isNukeable = [&to_nuke](const QChar &ch)->bool { + return to_nuke.contains(ch); + }; + r.removeIf(isNukeable); } return r; } @@ -151,7 +148,8 @@ csv_dequote(const QString& string, const QString& enclosure) /*****************************************************************************/ QStringList csv_linesplit(const QString& string, const QString& delimited_by, - const QString& enclosed_in, const int line_no, CsvQuoteMethod method) + const QString& enclosed_in, const int line_no, CsvQuoteMethod method, + bool* delimiter_detected) { QStringList retval; @@ -165,6 +163,7 @@ csv_linesplit(const QString& string, const QString& delimited_by, * whitespace eater consume the space. */ QString delimiter = delimited_by; + bool delimiter_seen = false; if (delimited_by == ", ") { delimiter = ","; } @@ -197,8 +196,10 @@ csv_linesplit(const QString& string, const QString& delimited_by, if (!enclosed) { if ((dlen > 0) && string.mid(p).startsWith(delimiter)) { dfound = true; + delimiter_seen = true; } else if (hyper_whitespace_delimiter && string.at(p).isSpace()) { dfound = true; + delimiter_seen = true; while ((p < string.size()) && string.at(p).isSpace()) { p++; } @@ -238,6 +239,9 @@ csv_linesplit(const QString& string, const QString& delimited_by, retval.append(value); } + if (delimiter_detected != nullptr) { + *delimiter_detected = delimiter_seen; + } return retval; } /*****************************************************************************/ diff --git a/csv_util.h b/csv_util.h index 149b4ff00..3a9f96185 100644 --- a/csv_util.h +++ b/csv_util.h @@ -43,7 +43,8 @@ enum class CsvQuoteMethod {historic, rfc4180}; QStringList csv_linesplit(const QString& string, const QString& delimited_by, - const QString& enclosed_in, int line_no, CsvQuoteMethod method = CsvQuoteMethod::historic); + const QString& enclosed_in, int line_no, CsvQuoteMethod method = CsvQuoteMethod::historic, + bool* delimiter_detected = nullptr); int dec_to_intdeg(double d); diff --git a/defs.h b/defs.h index 59529761a..73dd84ed3 100644 --- a/defs.h +++ b/defs.h @@ -19,11 +19,12 @@ #ifndef DEFS_H_INCLUDED_ #define DEFS_H_INCLUDED_ -#include // for M_PI +#include // for nan #include // for NULL, nullptr_t, size_t #include // for int32_t, uint32_t #include // for NULL, fprintf, FILE, stdout #include // for time_t +#include // for inv_pi, pi #include // for optional #include // for move @@ -36,7 +37,6 @@ #include // for QString #include // for QStringView #include // for QTextCodec -#include // for QVector #include // for CaseInsensitive #include // for QForeachContainer, qMakeForeachContainer, foreach, qint64 @@ -50,12 +50,6 @@ #define CSTR(qstr) ((qstr).toUtf8().constData()) #define CSTRc(qstr) ((qstr).toLatin1().constData()) -/* - * Amazingly, this constant is not specified in the standard... - */ -#ifndef M_PI -# define M_PI 3.14159265358979323846 -#endif /* * The constants marked "exact in decimal notation" may be more accurately @@ -115,8 +109,16 @@ constexpr double MPH_TO_MPS(double a) { return a * kMPSPerMPH;} /* knots(nautical miles/hour) to meters/second */ constexpr double KNOTS_TO_MPS(double a) {return a * kMPSPerKnot;} +/* Degrees to radians */ +constexpr double kDegreesPerRadian = 180.0 * std::numbers::inv_pi; +constexpr double DEG(double x) { return x * kDegreesPerRadian; } + +/* Radians to degrees */ +constexpr double kRadiansPerDegree = 1.0 / kDegreesPerRadian; +constexpr double RAD(double x) { return x * kRadiansPerDegree; } + constexpr int kDatumOSGB36 = 86; // GPS_Lookup_Datum_Index("OSGB36") -constexpr int kDautmWGS84 = 118; // GPS_Lookup_Datum_Index("WGS 84") +constexpr int kDatumWGS84 = 118; // GPS_Lookup_Datum_Index("WGS 84") /* @@ -235,39 +237,11 @@ class UrlList : public QList class wp_flags { public: - wp_flags() : - shortname_is_synthetic(0), - fmt_use(0), - is_split(0), - new_trkseg(0), - marked_for_deletion(0) {} - unsigned int shortname_is_synthetic:1; - unsigned int fmt_use:2; /* lightweight "extra data" */ - unsigned int is_split:1; /* the waypoint represents a split */ - unsigned int new_trkseg:1; /* True if first in new trkseg. */ - unsigned int marked_for_deletion:1; /* True if schedulded for deletion. */ -}; - -// These are dicey as they're collected on read. Subsequent filters may change -// things, though it's unlikely to matter in practical terms. Don't use these -// if a false positive would be deleterious. -# -class global_trait -{ -public: - global_trait() : - trait_geocaches(0), - trait_heartrate(0), - trait_cadence(0), - trait_power(0), - trait_depth(0), - trait_temperature(0) {} - unsigned int trait_geocaches:1; - unsigned int trait_heartrate:1; - unsigned int trait_cadence:1; - unsigned int trait_power:1; - unsigned int trait_depth:1; - unsigned int trait_temperature:1; + unsigned int shortname_is_synthetic:1{0}; + unsigned int fmt_use:2{0}; /* lightweight "extra data" */ + unsigned int is_split:1{0}; /* the waypoint represents a split */ + unsigned int new_trkseg:1{0}; /* True if first in new trkseg. */ + unsigned int marked_for_deletion:1{0}; /* True if schedulded for deletion. */ }; /* @@ -282,6 +256,35 @@ struct bounds { double min_alt; /* -unknown_alt => invalid */ }; +struct PositionRad; // forward declare +struct PositionDeg +{ + PositionDeg() = default; + explicit(false) inline PositionDeg(const PositionRad& posr); /* converting ctor */ + PositionDeg(double latd, double lond) : latD(latd), lonD(lond) {} + + double latD{std::nan("")}; + double lonD{std::nan("")}; +}; + +struct PositionRad +{ + PositionRad() = default; + explicit(false) inline PositionRad(const PositionDeg& posd); /* converting ctor */ + PositionRad(double latr, double lonr) : latR(latr), lonR(lonr) {} + + double latR{std::nan("")}; + double lonR{std::nan("")}; +}; + +inline PositionDeg::PositionDeg(const PositionRad& posr) : + latD(posr.latR * kDegreesPerRadian), + lonD(posr.lonR * kDegreesPerRadian) {} + +inline PositionRad::PositionRad(const PositionDeg& posd) : + latR(posd.latD * kRadiansPerDegree), + lonR(posd.lonD * kRadiansPerDegree) {} + /* * This is a waypoint, as stored in the GPSR. It tries to not * cater to any specific model or protocol. Anything that needs to @@ -297,21 +300,14 @@ class Waypoint class op_flags { public: - op_flags() : - temperature(false), - proximity(false), - course(false), - speed(false), - geoidheight(false), - depth(false) {} - bool temperature:1; /* temperature field is set */ - bool proximity:1; /* proximity field is set */ - bool course:1; /* course field is set */ - bool speed:1; /* speed field is set */ - bool geoidheight:1; /* geoidheight field is set */ - bool depth:1; /* depth field is set */ + bool temperature:1{false}; /* temperature field is set */ + bool proximity:1{false}; /* proximity field is set */ + bool course:1{false}; /* course field is set */ + bool speed:1{false}; /* speed field is set */ + bool geoidheight:1{false}; /* geoidheight field is set */ + bool depth:1{false}; /* depth field is set */ /* !ToDo! - unsigned int altitude:1; /+ altitude field is set +/ + unsigned int altitude:1{false}; /+ altitude field is set +/ ... and hdop,pdop,vdop,fix,sat,heartrate,cadence,power, odometer_distance */ @@ -348,7 +344,7 @@ class Waypoint Waypoint(); ~Waypoint(); Waypoint(const Waypoint& other); - Waypoint& operator=(const Waypoint& other); + Waypoint& operator=(const Waypoint& rhs); /* Member Functions */ @@ -361,6 +357,13 @@ class Waypoint void SetCreationTime(qint64 t, qint64 ms = 0); Geocache* AllocGCData(); int EmptyGCData() const; + void NormalizePosition(); + PositionDeg position() const {return PositionDeg(latitude, longitude);} + void SetPosition(const PositionDeg& pos) + { + latitude = pos.latD; + longitude = pos.lonD; + } // mimic std::optional interface, but use our more space // efficient wp_flags. @@ -507,13 +510,12 @@ class WaypointList : private QList using QList::size_type; }; -const global_trait* get_traits(); void waypt_init(); //void update_common_traits(const Waypoint* wpt); void waypt_add(Waypoint* wpt); void waypt_del(Waypoint* wpt); void del_marked_wpts(); -unsigned int waypt_count(); +int waypt_count(); void waypt_status_disp(int total_ct, int myct); //void waypt_disp_all(waypt_cb); /* template */ //void waypt_disp_session(const session_t* se, waypt_cb cb); /* template */ @@ -697,10 +699,10 @@ class RouteList : private QList }; void route_init(); -unsigned int route_waypt_count(); -unsigned int route_count(); -unsigned int track_waypt_count(); -unsigned int track_count(); +int route_waypt_count(); +int route_count(); +int track_waypt_count(); +int track_count(); route_head* route_head_alloc(); void route_add_head(route_head* rte); void route_del_head(route_head* rte); @@ -724,8 +726,8 @@ void track_disp_session(const session_t* se, route_hdr rh, route_trl rt, waypt_c void route_flush_all_routes(); void route_flush_all_tracks(); void route_deinit(); -void route_append(RouteList* src); -void track_append(RouteList* src); +void route_append(const RouteList* src); +void track_append(const RouteList* src); void route_backup(RouteList** head_bak); void route_restore(RouteList* head_bak); void route_swap(RouteList& other); @@ -830,37 +832,6 @@ struct posn_status { extern posn_status tracking_status; -using ff_init = void (*)(const QString&); -using ff_deinit = void (*)(); -using ff_read = void (*)(); -using ff_write = void (*)(); -using ff_exit = void (*)(); -using ff_writeposn = void (*)(Waypoint*); -using ff_readposn = Waypoint* (*)(posn_status*); - -/* - * All shortname functions take a shortname handle as the first arg. - * This is an opaque pointer. Callers must not fondle the contents of it. - */ -// This is a crutch until the new C++ shorthandle goes in. - -struct mkshort_handle_imp; // forward declare, definition in mkshort.cc -using short_handle = mkshort_handle_imp*; - -QByteArray mkshort(short_handle, const QByteArray&, bool); -QString mkshort(short_handle, const QString&); -short_handle mkshort_new_handle(); -QString mkshort_from_wpt(short_handle h, const Waypoint* wpt); -void mkshort_del_handle(short_handle* h); -void setshort_length(short_handle, int n); -void setshort_badchars(short_handle, const char*); -void setshort_goodchars(short_handle, const char*); -void setshort_mustupper(short_handle, int n); -void setshort_mustuniq(short_handle, int n); -void setshort_whitespace_ok(short_handle, int n); -void setshort_repeating_whitespace_ok(short_handle, int n); -void setshort_defname(short_handle, const char* s); - #define ARGTYPE_UNKNOWN 0x00000000U #define ARGTYPE_INT 0x00000001U #define ARGTYPE_FLOAT 0x00000002U @@ -932,38 +903,6 @@ enum ff_cap { #define FF_CAP_RW_WPT \ { (ff_cap) (ff_cap_read | ff_cap_write), ff_cap_none, ff_cap_none} -/* - * Format capabilities for realtime positioning. - */ -struct position_ops_t { - ff_init rd_init; - ff_readposn rd_position; - ff_deinit rd_deinit; - - ff_init wr_init; - ff_writeposn wr_position; - ff_deinit wr_deinit; -}; - -#define NULL_POS_OPS { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, } - -/* - * Describe the file format to the caller. - */ -struct ff_vecs_t { - ff_type type; - QVector cap; - ff_init rd_init; - ff_init wr_init; - ff_deinit rd_deinit; - ff_deinit wr_deinit; - ff_read read; - ff_write write; - ff_exit exit; - QVector* args; - position_ops_t position_ops; -}; - [[noreturn]] void fatal(QDebug& msginstance); // cppcheck 2.10.3 fails to assign noreturn attribute to fatal if // the noreturn attribute is listed before the gnu::format attribute. @@ -973,8 +912,8 @@ struct ff_vecs_t { // This can have a large effect on codacy issues from cppcheck // nullPointerRedundantCheck, nullPointerArithmeticRedundantCheck, // negativeIndex, arrayIndexOutOfBoundsCond. -[[gnu::format(printf, 1, 2)]] [[noreturn]] void fatal(const char*, ...); -[[gnu::format(printf, 1, 2)]] void warning(const char*, ...); +[[gnu::format(printf, 1, 2)]] [[noreturn]] void fatal(const char* fmt, ...); +[[gnu::format(printf, 1, 2)]] void warning(const char* fmt, ...); void printposn(double c, bool is_lat); @@ -983,7 +922,6 @@ void* xmalloc(size_t size); void* xrealloc(void* p, size_t s); void xfree(const void* mem); char* xstrdup(const QString& s); -char* xstrndup(const char* str, size_t sz); char* xstrdup(const char* s); FILE* xfopen(const char* fname, const char* type, const char* errtxt); @@ -1012,8 +950,8 @@ QDateTime dotnet_time_to_qdatetime(long long dotnet); long long qdatetime_to_dotnet_time(const QDateTime& dt); QString strip_html(const QString& utfstring); QString strip_nastyhtml(const QString& in); -QString convert_human_date_format(const char* human_datef); /* "MM,YYYY,DD" -> "%m,%Y,%d" */ -QString convert_human_time_format(const char* human_timef); /* "HH+mm+ss" -> "%H+%M+%S" */ +QString convert_human_date_format(const QString& human_datef); /* "MM,YYYY,DD" -> "%m,%Y,%d" */ +QString convert_human_time_format(const QString& human_timef); /* "HH+mm+ss" -> "%H+%M+%S" */ QString pretty_deg_format(double lat, double lon, char fmt, const char* sep, bool html); /* decimal -> dd.dddd or dd mm.mmm or dd mm ss */ QString get_filename(const QString& fname); /* extract the filename portion */ @@ -1075,9 +1013,6 @@ enum grid_type { #define GRID_INDEX_MIN grid_lat_lon_ddd #define GRID_INDEX_MAX grid_swiss -void* gb_int2ptr(int i); -int gb_ptr2int(const void* p); - QTextCodec* get_codec(const QByteArray& cs_name); void list_codecs(); void list_timezones(); @@ -1108,10 +1043,4 @@ int color_to_bbggrr(const char* cname); constexpr double unknown_alt = -99999999.0; constexpr int unknown_color = -1; -#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) -using qhash_result_t = uint; -#else -using qhash_result_t = size_t; -#endif - #endif // DEFS_H_INCLUDED_ diff --git a/legacyformat.h b/deprecated/legacyformat.h similarity index 100% rename from legacyformat.h rename to deprecated/legacyformat.h diff --git a/dg-100.h b/dg-100.h index 12c609712..346ea5ff4 100644 --- a/dg-100.h +++ b/dg-100.h @@ -126,8 +126,8 @@ class Dg100Format : public Format void dg100_getfiles() const; int dg100_erase() const; void common_rd_init(const QString& fname); - void dg100_rd_init(const QString& fname, bool isfile); - void dg200_rd_init(const QString& fname, bool isfile); + void dg100_rd_init(const QString& fname, bool is_file); + void dg200_rd_init(const QString& fname, bool is_file); /* Data Members */ diff --git a/duplicate.cc b/duplicate.cc index 4739ae450..32378b319 100644 --- a/duplicate.cc +++ b/duplicate.cc @@ -21,52 +21,17 @@ #include "duplicate.h" -#include // for stable_sort +#include // for as_const -#include // for QDateTime #include // for QList, QList<>::iterator, QList<>::const_iterator #include // for QMultiHash #include "defs.h" -#include "geocache.h" // for Geocache -#include "src/core/datetime.h" // for DateTime #if FILTERS_ENABLED #define MYNAME "duplicate" -/* - -It looks odd that we have different comparisons for date and index. - If exported if a < b return 1 - if index if a < b return -1 - -The reason is that we want to sort in reverse order by date, but forward -order by index. So if we have four records: - - date index - June 24 0 - June 25 1 - June 25 2 - June 24 3 - -we want to sort them like this: - - date index - June 25 1 - June 25 2 - June 24 0 - June 24 3 - -Thus, the first point we come across is the latest point, but if we -have two points with the same export date/time, we will first see the -one with the smaller index (i.e. the first of those two points that we -came across while importing waypoints.) - -In the (common) case that we have no exported dates, the dates will all -be zero so the sort will end up being an expensive no-op. However, the -complexity of this filter is dominated by other concerns. -*/ void DuplicateFilter::init() { @@ -77,15 +42,8 @@ void DuplicateFilter::init() void DuplicateFilter::process() { - auto wptlist = *global_waypoint_list; - - auto compare_lambda = [](const Waypoint* wa, const Waypoint* wb)->bool { - return wa->gc_data->exported > wb->gc_data->exported; - }; - std::stable_sort(wptlist.begin(), wptlist.end(), compare_lambda); - QMultiHash wpthash; - for (Waypoint* waypointp : wptlist) { + for (Waypoint* waypointp : std::as_const(*global_waypoint_list)) { QString key; if (lcopt) { @@ -97,7 +55,7 @@ void DuplicateFilter::process() .arg(degrees2ddmm(waypointp->latitude), 11, 'f', 3) .arg(degrees2ddmm(waypointp->longitude), 11, 'f', 3); } - + if (snopt) { key.append(waypointp->shortname); } @@ -115,10 +73,9 @@ void DuplicateFilter::process() wptfirst->latitude = wptlast->latitude; wptfirst->longitude = wptlast->longitude; } - for (auto it = values.cbegin(); it != values.cend(); ++it) { - Waypoint* wpt = *it; + for (Waypoint* wpt : values) { if (purge_duplicates || (wpt != wptfirst)) { - wpt->wpt_flags.marked_for_deletion = 1;; + wpt->wpt_flags.marked_for_deletion = 1; } } } diff --git a/exif.cc b/exif.cc index 25bcd7b06..cece53d16 100644 --- a/exif.cc +++ b/exif.cc @@ -50,7 +50,7 @@ #include // for QVariant #include // for QVector #include // for UTC, ISODate -#include // for qAsConst, qPrintable, qint64 +#include // for qPrintable, qint64 #include // for sort, min #include // for assert @@ -61,9 +61,9 @@ #include // for printf, SEEK_SET, snprintf, SEEK_CUR #include // for abs #include // for memcmp, strlen -#include // for add_const<>::type +#include // for as_const -#include "defs.h" // for Waypoint, fatal, warning, global_options, global_opts, unknown_alt, xfree, route_disp_all, track_disp_all, waypt_disp_all, wp_flags, KNOTS_TO_MPS, KPH_TO_MPS, MPH_TO_MPS, MPS_TO_KPH, WAYPT_HAS, case_ignore_strcmp, waypt_add, xstrdup, xstrndup, fix_2d +#include "defs.h" // for Waypoint, fatal, warning, global_options, global_opts, unknown_alt, xfree, route_disp_all, track_disp_all, waypt_disp_all, wp_flags, KNOTS_TO_MPS, KPH_TO_MPS, MPH_TO_MPS, MPS_TO_KPH, WAYPT_HAS, case_ignore_strcmp, waypt_add, xstrdup, fix_2d #include "garmin_tables.h" // for gt_lookup_datum_index #include "gbfile.h" // for gbfputuint32, gbfputuint16, gbfgetuint16, gbfgetuint32, gbfseek, gbftell, gbfile, gbfclose, gbfcopyfrom, gbfwrite, gbfopen_be, gbfread, gbfrewind, gbfgetflt, gbfgetint16, gbfopen, gbfputc, gbfputflt, gbsize_t, gbfeof, gbfgetdbl, gbfputdbl, gbfile::(anonymous) #include "jeeps/gpsmath.h" // for GPS_Math_WGS84_To_Known_Datum_M @@ -209,7 +209,7 @@ ExifFormat::exif_read_str(ExifTag* tag) // Panasonic DMC-TZ10 stores datum with trailing spaces. // Kodak stores zero count ASCII tags. QByteArray buf = (tag->count == 0) ? QByteArray("") : tag->data.at(0).toByteArray(); - // If the bytearray contains internal NULL(s), get rid of the first and + // If the bytearray contains internal NULL(s), get rid of the first and // anything after it. if (auto idx = buf.indexOf('\0'); idx >= 0) { buf = buf.left(idx); @@ -267,13 +267,13 @@ ExifFormat::exif_read_timestamp(const ExifTag* tag) QDate ExifFormat::exif_read_datestamp(const ExifTag* tag) { - return QDate::fromString(tag->data.at(0).toByteArray().constData(), "yyyy:MM:dd"); + return QDate::fromString(tag->data.at(0).toByteArray().constData(), u"yyyy:MM:dd"); } void ExifFormat::exif_release_apps() { - for (auto* app : qAsConst(*exif_apps)) { + for (auto* app : std::as_const(*exif_apps)) { if (app->fcache) { gbfclose(app->fcache); } @@ -579,7 +579,9 @@ void ExifFormat::exif_read_app(ExifApp* app) { gbsize_t offs; - uint32_t exif_ifd_ofs, gps_ifd_ofs, inter_ifd_ofs; + uint32_t exif_ifd_ofs; + uint32_t gps_ifd_ofs; + uint32_t inter_ifd_ofs; ExifIfd* ifd; gbfile* fin = app->fexif; @@ -695,7 +697,7 @@ ExifFormat::exif_get_exif_time(ExifApp* app) const // Note the assumption of local time can be problematic if the data // is processed in a different time zone than was used in recording // the time in the image. - res = QDateTime::fromString(str, "yyyy:MM:dd hh:mm:ss"); + res = QDateTime::fromString(str, u"yyyy:MM:dd hh:mm:ss"); // Exif 2.31 added offset tags to record the offset to UTC. // If these are present use them, otherwise assume local time. @@ -849,7 +851,7 @@ ExifFormat::exif_waypt_from_exif_app(ExifApp* app) const if (idatum < 0) { fatal(MYNAME ": Unknown GPSMapDatum \"%s\"!\n", datum.constData()); } - if (idatum != kDautmWGS84) { + if (idatum != kDatumWGS84) { GPS_Math_WGS84_To_Known_Datum_M(wpt->latitude, wpt->longitude, 0.0, &wpt->latitude, &wpt->longitude, &alt, idatum); } @@ -1304,7 +1306,7 @@ ExifFormat::exif_write_apps() const { gbfputuint16(0xFFD8, fout_); - for (auto* app : qAsConst(*exif_apps)) { + for (auto* app : std::as_const(*exif_apps)) { gbfputuint16(app->marker, fout_); @@ -1574,7 +1576,7 @@ ExifFormat::write() exif_put_double(GPS_IFD, GPS_IFD_TAG_TIMESTAMP, 0, dt.time().hour()); exif_put_double(GPS_IFD, GPS_IFD_TAG_TIMESTAMP, 1, dt.time().minute()); exif_put_double(GPS_IFD, GPS_IFD_TAG_TIMESTAMP, 2, - static_cast(dt.time().second()) + + static_cast(dt.time().second()) + static_cast(dt.time().msec())/1000.0); exif_put_str(GPS_IFD, GPS_IFD_TAG_DATESTAMP, CSTR(dt.toString(u"yyyy:MM:dd"))); diff --git a/exif.h b/exif.h index 3c0a9f85e..2be58deda 100644 --- a/exif.h +++ b/exif.h @@ -115,7 +115,7 @@ class ExifFormat : public Format // Return data value interpreted as EXIF_TYPE_LONG. // This is most useful when the type is EXIF_TYPE_LONG and the count is one, // which occurs for multiple specific tags where we need the value. - inline uint32_t toLong() const + uint32_t toLong() const { return data.at(0).value(); } diff --git a/filter_vecs.cc b/filter_vecs.cc index 6e0f23d67..ccb2e1a6b 100644 --- a/filter_vecs.cc +++ b/filter_vecs.cc @@ -65,47 +65,39 @@ Filter* fltfactory() } struct FilterVecs::Impl { - ArcDistanceFilter arcdist; - BendFilter bend; - DiscardFilter discard; - DuplicateFilter duplicate; - HeightFilter height; - InterpolateFilter interpolate; - PolygonFilter polygon; - PositionFilter position; - RadiusFilter radius; - ReverseRouteFilter reverse_route; - SimplifyRouteFilter routesimple; StackFilter stackfilt; - SwapDataFilter swapdata; - TrackFilter trackfilter; const QVector filter_vec_list = { #if FILTERS_ENABLED { - &arcdist, + nullptr, "arc", "Include Only Points Within Distance of Arc", + &fltfactory }, { - &bend, + nullptr, "bend", - "Add points before and after bends in routes" + "Add points before and after bends in routes", + &fltfactory }, { - &discard, + nullptr, "discard", - "Remove unreliable points with high hdop or vdop" + "Remove unreliable points with high hdop or vdop", + &fltfactory }, { - &duplicate, + nullptr, "duplicate", "Remove Duplicates", + &fltfactory }, { - &interpolate, + nullptr, "interpolate", - "Interpolate between trackpoints" + "Interpolate between trackpoints", + &fltfactory }, { nullptr, @@ -114,19 +106,22 @@ struct FilterVecs::Impl { &fltfactory }, { - &polygon, + nullptr, "polygon", "Include Only Points Inside Polygon", + &fltfactory }, { - &position, + nullptr, "position", "Remove Points Within Distance", + &fltfactory }, { - &radius, + nullptr, "radius", "Include Only Points Within Radius", + &fltfactory }, { nullptr, @@ -135,9 +130,10 @@ struct FilterVecs::Impl { &fltfactory }, { - &routesimple, + nullptr, "simplify", "Simplify routes", + &fltfactory }, { nullptr, @@ -148,17 +144,20 @@ struct FilterVecs::Impl { { &stackfilt, "stack", - "Save and restore waypoint lists" + "Save and restore waypoint lists", + nullptr }, { - &reverse_route, + nullptr, "reverse", "Reverse stops within routes", + &fltfactory }, { - &trackfilter, + nullptr, "track", - "Manipulate track lists" + "Manipulate track lists", + &fltfactory }, { nullptr, @@ -167,14 +166,16 @@ struct FilterVecs::Impl { &fltfactory }, { - &height, + nullptr, "height", - "Manipulate altitudes" + "Manipulate altitudes", + &fltfactory }, { - &swapdata, + nullptr, "swap", - "Swap latitude and longitude of all loaded points" + "Swap latitude and longitude of all loaded points", + &fltfactory }, { nullptr, @@ -184,9 +185,10 @@ struct FilterVecs::Impl { } #elif defined (MINIMAL_FILTERS) { - &trackfilter, + nullptr, "track", - "Manipulate track lists" + "Manipulate track lists", + &fltfactory } #endif }; diff --git a/filter_vecs.h b/filter_vecs.h index 2abe2d366..beaaf0c3e 100644 --- a/filter_vecs.h +++ b/filter_vecs.h @@ -39,7 +39,7 @@ class FilterVecs class fltinfo_t { public: - bool isDynamic() { + bool isDynamic() const { return factory != nullptr; } explicit operator bool() const { diff --git a/formspec.h b/formspec.h index 942e596aa..44261561c 100644 --- a/formspec.h +++ b/formspec.h @@ -26,6 +26,7 @@ enum FsType { kFsUnknown = 0L, kFsGpx = 0x67707800L, + kFsGpxWpt = 0x67707877L, kFsOzi = 0x6f7a6900L, kFsGmsd = 0x474d5344L, /* GMSD = Garmin specific data */ kFsQstarzBl1000 = 0x5173747aL, diff --git a/garmin.cc b/garmin.cc index 976033291..13012f5ee 100644 --- a/garmin.cc +++ b/garmin.cc @@ -19,147 +19,73 @@ */ -#include // for assert +#include "garmin.h" + #include // for INT_MAX -#include // for atan2, floor, sqrt +#include // for atan2, modf, sqrt #include // for fprintf, fflush, snprintf, snprintf +#include // for int32_t #include // for strtol #include // for memcpy, strlen, strncpy, strchr #include // for time_t +#include // for as_const #include // for QByteArray -#include // for QRegularExpression +#include // for QChar +#include // for QList<>::const_iterator #include // for QString #include // for QTextCodec -#include // for QVector #include // for CaseInsensitive -#include // for qPrintable, foreach +#include // for qPrintable, qRound64, Q_INT64_C, qint64 #include "defs.h" #include "formspec.h" // for FormatSpecificDataList #include "garmin_fs.h" // for garmin_fs_garmin_after_read, garmin_fs_garmin_before_write #include "garmin_tables.h" // for gt_find_icon_number_from_desc, PCX, gt_find_desc_from_icon_number #include "geocache.h" // for Geocache, Geocache::type_t, Geocache... -#include "grtcirc.h" // for DEG #include "jeeps/gpsapp.h" // for GPS_Set_Baud_Rate, GPS_Init, GPS_Pre... #include "jeeps/gpscom.h" // for GPS_Command_Get_Lap, GPS_Command_Get... -#include "jeeps/gpsdevice.h" // for gpsdevh #include "jeeps/gpsmem.h" // for GPS_Track_Del, GPS_Way_Del, GPS_Pvt_Del -#include "jeeps/gpsport.h" // for int32 #include "jeeps/gpsprot.h" // for gps_waypt_type, gps_category_type #include "jeeps/gpssend.h" // for GPS_SWay, GPS_PWay, GPS_STrack, GPS_... #include "jeeps/gpsserial.h" // for DEFAULT_BAUD #include "jeeps/gpsutil.h" // for GPS_User, GPS_Enable_Diagnose, GPS_E... #include "src/core/datetime.h" // for DateTime +#include "mkshort.h" // for MakeShort #define MYNAME "GARMIN" -static const char* portname; -static short_handle mkshort_handle; -static GPS_PWay* tx_waylist; -static GPS_PWay* tx_routelist; -static GPS_PWay* cur_tx_routelist_entry; -static GPS_PTrack* tx_tracklist; -static GPS_PTrack* cur_tx_tracklist_entry; -static int my_track_count = 0; -static char* getposn = nullptr; -static char* poweroff = nullptr; -static char* eraset = nullptr; -static char* resettime = nullptr; -static char* snlen = nullptr; -static char* snwhiteopt = nullptr; -static char* deficon = nullptr; -static char* category = nullptr; -static char* categorybitsopt = nullptr; -static char* baudopt = nullptr; -static char* opt_codec = nullptr; -static int baud = 0; -static int categorybits; -static int receiver_must_upper = 1; -static QTextCodec* codec{nullptr}; #define MILITANT_VALID_WAYPT_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -/* Technically, even this is a little loose as spaces aren't allowed */ -static const char* valid_waypt_chars = MILITANT_VALID_WAYPT_CHARS " "; -static QRegularExpression invalid_char_re; - -static -QVector garmin_args = { - { - "snlen", &snlen, "Length of generated shortnames", nullptr, - ARGTYPE_INT, "1", nullptr, nullptr - }, - { - "snwhite", &snwhiteopt, "Allow whitespace synth. shortnames", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { "deficon", &deficon, "Default icon name", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr }, - { - "get_posn", &getposn, "Return current position as a waypoint", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "power_off", &poweroff, "Command unit to power itself down", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "erase_t", &eraset, "Erase existing courses when writing new ones", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "resettime", &resettime, "Sync GPS time to computer time", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "category", &category, "Category number to use for written waypoints", - nullptr, ARGTYPE_INT, "1", "16", nullptr - }, - { - "bitscategory", &categorybitsopt, "Bitmap of categories", - nullptr, ARGTYPE_INT, "1", "65535", nullptr - }, - { - "baud", &baudopt, "Speed in bits per second of serial port (baud=9600)", - nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr - }, - { - "codec", &opt_codec, "override codec to use for device", - nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - -}; - -static const char* d103_symbol_from_icon_number(unsigned int n); -static int d103_icon_number_from_symbol(const QString& s); -static void garmin_fs_garmin_after_read(GPS_PWay way, Waypoint* wpt, int protoid); -static void garmin_fs_garmin_before_write(const Waypoint* wpt, GPS_PWay way, int protoid); - -static QByteArray str_from_unicode(const QString& qstr) + +QByteArray GarminFormat::str_from_unicode(const QString& qstr) { return codec->fromUnicode(qstr); } -static QString str_to_unicode(const QByteArray& cstr) +QString GarminFormat::str_to_unicode(const QByteArray& cstr) { return codec->toUnicode(cstr); } -static void -write_char_string(char* dest, const char* source, size_t destsize) +void +GarminFormat::write_char_string(char* dest, const char* source, size_t destsize) { // we zero fill and always terminate within the dest buffer. strncpy(dest, source, destsize - 1); dest[destsize-1] = 0; } -static void -rw_init(const QString& fname) +void +GarminFormat::rw_init(const QString& fname) { - receiver_must_upper = 1; + receiver_must_upper = true; const char* receiver_charset = "US-ASCII"; + /* Technically, even this is a little loose as spaces aren't allowed */ + const char* valid_waypt_chars = MILITANT_VALID_WAYPT_CHARS " "; if (!mkshort_handle) { - mkshort_handle = mkshort_new_handle(); + mkshort_handle = new MakeShort; } if (global_opts.debug_level > 0) { @@ -218,7 +144,7 @@ rw_init(const QString& fname) } /* - * Grope the unit we're talking to to set setshort_length to + * Grope the unit we're talking to to set set_length to * 20 for the V, * 10 for Street Pilot, (old) Rhino, 76 * 6 for the III, 12, emap, and etrex @@ -260,7 +186,7 @@ rw_init(const QString& fname) case 574: /* Geko 201 */ receiver_short_length = 6; valid_waypt_chars = MILITANT_VALID_WAYPT_CHARS " +-"; - setshort_badchars(mkshort_handle, "\"$.,'!"); + mkshort_handle->set_badchars("\"$.,'!"); break; case 155: /* Garmin V */ @@ -270,7 +196,7 @@ rw_init(const QString& fname) break; case 382: /* C320 */ receiver_short_length = 30; - receiver_must_upper = 0; + receiver_must_upper = false; break; case 292: /* (60|76)C[S]x series */ case 421: /* Vista|Legend Cx */ @@ -280,7 +206,7 @@ rw_init(const QString& fname) case 957: /* Legend HC */ receiver_short_length = 14; snwhiteopt = xstrdup("1"); - receiver_must_upper = 0; + receiver_must_upper = false; /* This might be 8859-1 */ receiver_charset = "windows-1252"; break; @@ -288,20 +214,20 @@ rw_init(const QString& fname) case 1095: /* GPS 72H */ receiver_short_length = 10; valid_waypt_chars = MILITANT_VALID_WAYPT_CHARS " +-"; - setshort_badchars(mkshort_handle, "\"$.,'!"); + mkshort_handle->set_badchars("\"$.,'!"); break; case 231: /* Quest */ case 463: /* Quest 2 */ - receiver_must_upper = 0; + receiver_must_upper = false; receiver_short_length = 30; receiver_charset = "windows-1252"; break; case 577: // Rino 530HCx Version 2.50 - receiver_must_upper = 0; + receiver_must_upper = false; receiver_short_length = 14; break; case 429: // Streetpilot i3 - receiver_must_upper = 0; + receiver_must_upper = false; receiver_charset = "windows-1252"; receiver_short_length = 30; break; @@ -332,13 +258,13 @@ rw_init(const QString& fname) * If the user provided a short_length, override the calculated value. */ if (snlen) { - setshort_length(mkshort_handle, xstrtoi(snlen, nullptr, 10)); + mkshort_handle->set_length(xstrtoi(snlen, nullptr, 10)); } else { - setshort_length(mkshort_handle, receiver_short_length); + mkshort_handle->set_length(receiver_short_length); } if (snwhiteopt) { - setshort_whitespace_ok(mkshort_handle, xstrtoi(snwhiteopt, nullptr, 10)); + mkshort_handle->set_whitespace_ok(xstrtoi(snwhiteopt, nullptr, 10)); } /* @@ -346,12 +272,12 @@ rw_init(const QString& fname) * for the new models, we just release this safety check manually. */ if (receiver_must_upper) { - setshort_goodchars(mkshort_handle, valid_waypt_chars); + mkshort_handle->set_goodchars(valid_waypt_chars); } else { - setshort_badchars(mkshort_handle, ""); + mkshort_handle->set_badchars(""); } - setshort_mustupper(mkshort_handle, receiver_must_upper); + mkshort_handle->set_mustupper(receiver_must_upper); /* * This used to mean something when we used cet, but these days this @@ -370,27 +296,17 @@ rw_init(const QString& fname) fprintf(stdout, "receiver charset detected as %s.\r\n", receiver_charset); } - /* - * Beware, valid_waypt_chars shouldn't contain any character class metacharacters, - * i.e. '\', '^', '-', '[', or ']' - */ - assert(!QString(valid_waypt_chars).contains('\\')); - assert(!QString(valid_waypt_chars).contains('^')); - assert(!QString(valid_waypt_chars).contains('-')); - assert(!QString(valid_waypt_chars).contains('[')); - assert(!QString(valid_waypt_chars).contains(']')); - invalid_char_re = QRegularExpression(QStringLiteral("[^%1]").arg(valid_waypt_chars)); - assert(invalid_char_re.isValid()); + valid_chars = valid_waypt_chars; } -static void -rd_init(const QString& fname) +void +GarminFormat::rd_init(const QString& fname) { rw_init(fname); } -static void -rw_deinit() +void +GarminFormat::rw_deinit() { if (gps_baud_rate != DEFAULT_BAUD) { if (0 == GPS_Set_Baud_Rate(portname, DEFAULT_BAUD)) { @@ -398,16 +314,17 @@ rw_deinit() } } - if (mkshort_handle) { - mkshort_del_handle(&mkshort_handle); - } + delete mkshort_handle; + mkshort_handle = nullptr; xfree(portname); portname = nullptr; + + valid_chars = QString(); } -static int -waypt_read_cb(int total_ct, GPS_PWay*) +int +GarminFormat::waypt_read_cb(int total_ct, GPS_PWay* /*unused*/) { if (global_opts.verbose_status) { static int i; @@ -417,8 +334,8 @@ waypt_read_cb(int total_ct, GPS_PWay*) return 0; } -static void -waypt_read() +void +GarminFormat::waypt_read() { int n; GPS_PWay* way = nullptr; @@ -484,14 +401,14 @@ waypt_read() } } -static int lap_read_nop_cb(int, struct GPS_SWay**) +int GarminFormat::lap_read_nop_cb(int /*unused*/, GPS_SWay** /*unused*/) { return 0; } // returns 1 if the waypoint's start_time can be found // in the laps array, 0 otherwise -static unsigned int checkWayPointIsAtSplit(Waypoint* wpt, GPS_PLap* laps, int nlaps) +unsigned int GarminFormat::checkWayPointIsAtSplit(Waypoint* wpt, GPS_PLap* laps, int nlaps) { int result = 0; @@ -517,9 +434,8 @@ static unsigned int checkWayPointIsAtSplit(Waypoint* wpt, GPS_PLap* laps, int nl return result; } -static void -track_read() +GarminFormat::track_read() { GPS_PTrack* array; route_head* trk_head = nullptr; @@ -534,7 +450,7 @@ track_read() } - int32 ntracks = GPS_Command_Get_Track(portname, &array, waypt_read_cb); + int32_t ntracks = GPS_Command_Get_Track(portname, &array, waypt_read_cb); if (ntracks <= 0) { return; @@ -601,9 +517,8 @@ track_read() xfree(array); } -static void -route_read() +GarminFormat::route_read() { GPS_PWay* array; /* TODO: Fixes warning but is it right? @@ -612,7 +527,7 @@ route_read() */ route_head* rte_head = nullptr; - int32 nroutepts = GPS_Command_Get_Route(portname, &array); + int32_t nroutepts = GPS_Command_Get_Route(portname, &array); // fprintf(stderr, "Routes %d\n", (int) nroutepts); #if 1 @@ -660,10 +575,16 @@ route_read() * code, we convert the PVT (position/velocity/time) data from the receiver * to the data type we use throughout. Yes, we do lose some data that way. */ -static void -pvt2wpt(GPS_PPvt_Data pvt, Waypoint* wpt) +void +GarminFormat::pvt2wpt(GPS_PPvt_Data pvt, Waypoint* wpt) { - wpt->altitude = pvt->alt; + // pvt->alt is height (in meters) above the WGS84 elipsoid. + // pvt->msl_hght is height (in meters) of WGS84 elipsoid above MSL. + // wpt->altitude is height (in meters) above geoid (mean sea level). + // wpt->geoidheight is "Height (in meters) of geoid (mean sea level) above WGS84 earth ellipsoid." + wpt->set_geoidheight(-pvt->msl_hght); + wpt->altitude = pvt->alt + pvt->msl_hght; + wpt->latitude = pvt->lat; wpt->longitude = pvt->lon; @@ -680,11 +601,13 @@ pvt2wpt(GPS_PPvt_Data pvt, Waypoint* wpt) * 3) The number of leap seconds that offset the current UTC and GPS * reference clocks. */ - double wptime = 631065600.0 + pvt->wn_days * 86400.0 + - pvt->tow - - pvt->leap_scnds; - double wptimes = floor(wptime); - wpt->SetCreationTime(wptimes, 1000000.0 * (wptime - wptimes)); + double tow_integral_part; + double tow_fractional_part = modf(pvt->tow, &tow_integral_part); + qint64 seconds = Q_INT64_C(631065600) + pvt->wn_days * Q_INT64_C(86400) + + qRound64(tow_integral_part) + - pvt->leap_scnds; + qint64 milliseconds = qRound64(1000.0 * tow_fractional_part); + wpt->SetCreationTime(seconds, milliseconds); /* * The Garmin spec fifteen different models that use a different @@ -720,22 +643,20 @@ pvt2wpt(GPS_PPvt_Data pvt, Waypoint* wpt) } } -static gpsdevh* pvt_fd; - -static void -pvt_init(const QString& fname) +void +GarminFormat::rd_position_init(const QString& fname) { rw_init(fname); GPS_Command_Pvt_On(qPrintable(fname), &pvt_fd); } -static Waypoint* -pvt_read(posn_status* posn_status) +Waypoint* +GarminFormat::rd_position(posn_status* posn_status) { auto* wpt = new Waypoint; GPS_PPvt_Data pvt = GPS_Pvt_New(); - if (GPS_Command_Pvt_Get(&pvt_fd, &pvt)) { + if (GPS_Command_Pvt_Get(pvt_fd, &pvt)) { pvt2wpt(pvt, wpt); GPS_Pvt_Del(&pvt); @@ -762,8 +683,8 @@ pvt_read(posn_status* posn_status) return nullptr; } -static void -data_read() +void +GarminFormat::read() { if (poweroff) { return; @@ -784,8 +705,8 @@ data_read() } } -static GPS_PWay -sane_GPS_Way_New() +GPS_PWay +GarminFormat::sane_GPS_Way_New() { GPS_PWay way = GPS_Way_New(); if (!way) { @@ -810,8 +731,8 @@ sane_GPS_Way_New() return way; } -static int -waypt_write_cb(GPS_PWay*) +int +GarminFormat::waypt_write_cb(GPS_PWay* /*unused*/) { int n = waypt_count(); @@ -827,8 +748,8 @@ waypt_write_cb(GPS_PWay*) * If we're using smart names, try to put the cache info in the * description. */ -static const char* -get_gc_info(const Waypoint* wpt) +const char* +GarminFormat::get_gc_info(const Waypoint* wpt) { if (global_opts.smart_names) { if (wpt->gc_data->type == Geocache::type_t::gt_virtual) { @@ -856,15 +777,15 @@ get_gc_info(const Waypoint* wpt) return ""; } -static int -waypoint_prepare() +int +GarminFormat::waypoint_prepare() { int i; int n = waypt_count(); extern WaypointList* global_waypoint_list; int icon; - tx_waylist = (struct GPS_SWay**) xcalloc(n,sizeof(*tx_waylist)); + tx_waylist = (GPS_SWay**) xcalloc(n,sizeof(*tx_waylist)); for (i = 0; i < n; i++) { tx_waylist[i] = sane_GPS_Way_New(); @@ -873,7 +794,7 @@ waypoint_prepare() i = 0; // Iterate with waypt_disp_all? - for (const Waypoint* wpt : qAsConst(*global_waypoint_list)) { + for (const Waypoint* wpt : std::as_const(*global_waypoint_list)) { char obuf[256]; QString src; @@ -888,11 +809,11 @@ waypoint_prepare() * mkshort will do collision detection and namespace * cleaning */ - QByteArray ident = mkshort(mkshort_handle, - global_opts.synthesize_shortnames ? - str_from_unicode(src) : - str_from_unicode(wpt->shortname), - false); + QByteArray ident = mkshort_handle->mkshort( + global_opts.synthesize_shortnames ? + str_from_unicode(src) : + str_from_unicode(wpt->shortname), + false); /* Should not be a strcpy as 'ident' isn't really a C string, * but rather a garmin "fixed length" buffer that's padded * to the end with spaces. So this is NOT (strlen+1). @@ -968,12 +889,12 @@ waypoint_prepare() return n; } -static void -waypoint_write() +void +GarminFormat::waypoint_write() { int n = waypoint_prepare(); - if (int32 ret = GPS_Command_Send_Waypoint(portname, tx_waylist, n, waypt_write_cb); ret < 0) { + if (int32_t ret = GPS_Command_Send_Waypoint(portname, tx_waylist, n, waypt_write_cb); ret < 0) { fatal(MYNAME ":communication error sending waypoints..\n"); } @@ -987,20 +908,25 @@ waypoint_write() xfree(tx_waylist); } -static void -route_hdr_pr(const route_head* rte) +void +GarminFormat::route_hdr_pr(const route_head* rte) { (*cur_tx_routelist_entry)->rte_num = rte->rte_num; (*cur_tx_routelist_entry)->isrte = 1; if (!rte->rte_name.isEmpty()) { + /* for devices that use D201_Rte_Hdr_Type */ + write_char_string((*cur_tx_routelist_entry)->rte_cmnt, + str_from_unicode(rte->rte_name).constData(), + sizeof((*cur_tx_routelist_entry)->rte_cmnt)); + /* for devices that use D202_Rte_Hdr_Type */ write_char_string((*cur_tx_routelist_entry)->rte_ident, str_from_unicode(rte->rte_name).constData(), sizeof((*cur_tx_routelist_entry)->rte_ident)); } } -static void -route_waypt_pr(const Waypoint* wpt) +void +GarminFormat::route_waypt_pr(const Waypoint* wpt) { GPS_PWay rte = *cur_tx_routelist_entry; @@ -1018,7 +944,11 @@ route_waypt_pr(const Waypoint* wpt) rte->lon = wpt->longitude; rte->lat = wpt->latitude; - rte->smbl = gt_find_icon_number_from_desc(wpt->icon_descr, PCX); + if (gps_rte_type == 103) { + rte->smbl = d103_icon_number_from_symbol(wpt->icon_descr); + } else { + rte->smbl = gt_find_icon_number_from_desc(wpt->icon_descr, PCX); + } // map class so unit doesn't duplicate routepoints as a waypoint. rte->wpt_class = 0x80; @@ -1036,7 +966,10 @@ route_waypt_pr(const Waypoint* wpt) * for the new models, we just release this safety check manually. */ if (receiver_must_upper) { - cleanname = cleanname.toUpper().remove(invalid_char_re); + auto isInvalidChar = [this](const QChar &ch)->bool { + return !valid_chars.contains(ch); + }; + cleanname = cleanname.toUpper().removeIf(isInvalidChar); } write_char_string(rte->ident, str_from_unicode(cleanname).constData(), @@ -1052,24 +985,36 @@ route_waypt_pr(const Waypoint* wpt) cur_tx_routelist_entry++; } -static void -route_write() +void +GarminFormat::route_write() { - int n = 2 * route_waypt_count(); /* Doubled for the islink crap. */ + const int n = 2 * route_waypt_count(); /* Doubled for the islink crap. */ - tx_routelist = (struct GPS_SWay**) xcalloc(n,sizeof(GPS_PWay)); + tx_routelist = (GPS_SWay**) xcalloc(n,sizeof(GPS_PWay)); cur_tx_routelist_entry = tx_routelist; for (int i = 0; i < n; i++) { tx_routelist[i] = sane_GPS_Way_New(); } - route_disp_all(route_hdr_pr, nullptr, route_waypt_pr); + auto route_hdr_pr_lambda = [this](const route_head* rte)->void { + route_hdr_pr(rte); + }; + auto route_waypt_pr_lambda = [this](const Waypoint* waypointp)->void { + route_waypt_pr(waypointp); + }; + route_disp_all(route_hdr_pr_lambda, nullptr, route_waypt_pr_lambda); GPS_Command_Send_Route(portname, tx_routelist, n); + + for (int i = 0; i < n; i++) { + GPS_Way_Del(&tx_routelist[i]); + } + + xfree(tx_routelist); } -static void -track_hdr_pr(const route_head* trk_head) +void +GarminFormat::track_hdr_pr(const route_head* trk_head) { (*cur_tx_tracklist_entry)->ishdr = true; if (!trk_head->rte_name.isEmpty()) { @@ -1083,8 +1028,8 @@ track_hdr_pr(const route_head* trk_head) my_track_count++; } -static void -track_waypt_pr(const Waypoint* wpt) +void +GarminFormat::track_waypt_pr(const Waypoint* wpt) { (*cur_tx_tracklist_entry)->lat = wpt->latitude; (*cur_tx_tracklist_entry)->lon = wpt->longitude; @@ -1099,26 +1044,32 @@ track_waypt_pr(const Waypoint* wpt) cur_tx_tracklist_entry++; } -static int -track_prepare() +int +GarminFormat::track_prepare() { - int32 n = track_waypt_count() + track_count(); + int32_t n = track_waypt_count() + track_count(); - tx_tracklist = (struct GPS_STrack**) xcalloc(n, sizeof(GPS_PTrack)); + tx_tracklist = (GPS_STrack**) xcalloc(n, sizeof(GPS_PTrack)); cur_tx_tracklist_entry = tx_tracklist; for (int i = 0; i < n; i++) { tx_tracklist[i] = GPS_Track_New(); } my_track_count = 0; - track_disp_all(track_hdr_pr, nullptr, track_waypt_pr); + auto track_hdr_pr_lambda = [this](const route_head* rte)->void { + track_hdr_pr(rte); + }; + auto track_waypt_pr_lambda = [this](const Waypoint* waypointp)->void { + track_waypt_pr(waypointp); + }; + track_disp_all(track_hdr_pr_lambda, nullptr, track_waypt_pr_lambda); GPS_Prepare_Track_For_Device(&tx_tracklist, &n); return n; } -static void -track_write() +void +GarminFormat::track_write() { int n = track_prepare(); GPS_Command_Send_Track(portname, tx_tracklist, n, (eraset)? 1 : 0); @@ -1129,8 +1080,8 @@ track_write() xfree(tx_tracklist); } -static void -course_write() +void +GarminFormat::course_write() { int i; @@ -1151,8 +1102,8 @@ course_write() xfree(tx_tracklist); } -static void -data_write() +void +GarminFormat::write() { if (poweroff) { return; @@ -1179,42 +1130,8 @@ data_write() } } - -ff_vecs_t garmin_vecs = { - ff_type_serial, - FF_CAP_RW_ALL, - rd_init, - rw_init, - rw_deinit, - rw_deinit, - data_read, - data_write, - nullptr, - &garmin_args, - { pvt_init, pvt_read, rw_deinit, nullptr, nullptr, nullptr } -}; - -static const char* d103_icons[16] = { - "dot", - "house", - "gas", - "car", - "fish", - "boat", - "anchor", - "wreck", - "exit", - "skull", - "flag", - "camp", - "circle_x", - "deer", - "1st_aid", - "back-track" -}; - -static const char* -d103_symbol_from_icon_number(unsigned int n) +const char* +GarminFormat::d103_symbol_from_icon_number(unsigned int n) { if (n <= 15) { return d103_icons[n]; @@ -1223,8 +1140,8 @@ d103_symbol_from_icon_number(unsigned int n) } } -static int -d103_icon_number_from_symbol(const QString& s) +int +GarminFormat::d103_icon_number_from_symbol(const QString& s) { if (s.isNull()) { return 0; @@ -1238,10 +1155,10 @@ d103_icon_number_from_symbol(const QString& s) return 0; } -static void -garmin_fs_garmin_after_read(const GPS_PWay way, Waypoint* wpt, const int protoid) +void +GarminFormat::garmin_fs_garmin_after_read(const GPS_PWay way, Waypoint* wpt, const int protoid) { - garmin_fs_t* gmsd = garmin_fs_alloc(protoid); + auto* gmsd = new garmin_fs_t(protoid); wpt->fs.FsChainAdd(gmsd); /* nothing happens until gmsd is allocated some lines above */ @@ -1272,10 +1189,10 @@ garmin_fs_garmin_after_read(const GPS_PWay way, Waypoint* wpt, const int protoid garmin_fs_t::set_addr(gmsd, str_to_unicode(QByteArray(way->addr, qstrnlen(way->addr, sizeof(way->addr))))); } -static void -garmin_fs_garmin_before_write(const Waypoint* wpt, GPS_PWay way, const int protoid) +void +GarminFormat::garmin_fs_garmin_before_write(const Waypoint* wpt, GPS_PWay way, const int protoid) { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); (void)protoid; // unused for now. diff --git a/garmin.h b/garmin.h new file mode 100644 index 000000000..68d42bbfb --- /dev/null +++ b/garmin.h @@ -0,0 +1,205 @@ +/* + Jeeps wrapper for Garmin serial protocol. + + Copyright (C) 2002, 2003, 2004, 2005, 2006 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + */ +#ifndef GARMIN_H_INCLUDED_ +#define GARMIN_H_INCLUDED_ + +#include // for size_t + +#include // for QByteArray +#include // for QString +#include // for QTextCodec +#include // for QVector + +#include "defs.h" +#include "format.h" // for Format +#include "jeeps/gpsdevice.h" // for gpsdevh +#include "jeeps/gpssend.h" // for GPS_PWay, GPS_SWay, GPS_PTrack, GPS_PPvt_Data, GPS_SLap +#include "mkshort.h" // for MakeShort + + +class GarminFormat : public Format +{ +public: + QVector* get_args() override + { + return &garmin_args; + } + + ff_type get_type() const override + { + return ff_type_serial; + } + + QVector get_cap() const override + { + return FF_CAP_RW_ALL; + } + + void rd_init(const QString& fname) override; + void read() override; + void rd_deinit() override + { + rw_deinit(); + } + void wr_init(const QString& fname) override + { + rw_init(fname); + } + void write() override; + void wr_deinit() override + { + rw_deinit(); + } + void rd_position_init(const QString& fname) override; + Waypoint* rd_position(posn_status* status) override; + void rd_position_deinit() override + { + rw_deinit(); + } + +private: + /* Member Functions */ + + QByteArray str_from_unicode(const QString& qstr); + QString str_to_unicode(const QByteArray& cstr); + static void write_char_string(char* dest, const char* source, size_t destsize); + void rw_init(const QString& fname); + void rw_deinit(); + static int waypt_read_cb(int total_ct, GPS_SWay** /* unused */); + void waypt_read(); + static int lap_read_nop_cb(int /* unused */, GPS_SWay** /* unused */); + static unsigned int checkWayPointIsAtSplit(Waypoint* wpt, GPS_SLap** laps, int nlaps); + void track_read(); + void route_read(); + static void pvt2wpt(GPS_PPvt_Data pvt, Waypoint* wpt); + static GPS_SWay* sane_GPS_Way_New(); + static int waypt_write_cb(GPS_SWay** /* unused */); + static const char* get_gc_info(const Waypoint* wpt); + int waypoint_prepare(); + void waypoint_write(); + void route_hdr_pr(const route_head* rte); + void route_waypt_pr(const Waypoint* wpt); + void route_write(); + void track_hdr_pr(const route_head* trk_head); + void track_waypt_pr(const Waypoint* wpt); + int track_prepare(); + void track_write(); + void course_write(); + static const char* d103_symbol_from_icon_number(unsigned int n); + static int d103_icon_number_from_symbol(const QString& s); + void garmin_fs_garmin_after_read(GPS_PWay way, Waypoint* wpt, int protoid); + void garmin_fs_garmin_before_write(const Waypoint* wpt, GPS_PWay way, int protoid); + + /* Data Members */ + + const char* portname{}; + MakeShort* mkshort_handle{}; + GPS_PWay* tx_waylist{}; + GPS_PWay* tx_routelist{}; + GPS_PWay* cur_tx_routelist_entry{}; + GPS_PTrack* tx_tracklist{}; + GPS_PTrack* cur_tx_tracklist_entry{}; + int my_track_count = 0; + char* getposn = nullptr; + char* poweroff = nullptr; + char* eraset = nullptr; + char* resettime = nullptr; + char* snlen = nullptr; + char* snwhiteopt = nullptr; + char* deficon = nullptr; + char* category = nullptr; + char* categorybitsopt = nullptr; + char* baudopt = nullptr; + char* opt_codec = nullptr; + int baud = 0; + int categorybits{}; + bool receiver_must_upper = true; + QTextCodec* codec{nullptr}; + + QString valid_chars; + + QVector garmin_args = { + { + "snlen", &snlen, "Length of generated shortnames", nullptr, + ARGTYPE_INT, "1", nullptr, nullptr + }, + { + "snwhite", &snwhiteopt, "Allow whitespace synth. shortnames", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { "deficon", &deficon, "Default icon name", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr }, + { + "get_posn", &getposn, "Return current position as a waypoint", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "power_off", &poweroff, "Command unit to power itself down", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "erase_t", &eraset, "Erase existing courses when writing new ones", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "resettime", &resettime, "Sync GPS time to computer time", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "category", &category, "Category number to use for written waypoints", + nullptr, ARGTYPE_INT, "1", "16", nullptr + }, + { + "bitscategory", &categorybitsopt, "Bitmap of categories", + nullptr, ARGTYPE_INT, "1", "65535", nullptr + }, + { + "baud", &baudopt, "Speed in bits per second of serial port (baud=9600)", + nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr + }, + { + "codec", &opt_codec, "override codec to use for device", + nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + + }; + + gpsdevh* pvt_fd{}; + + static constexpr const char* d103_icons[16] = { + "dot", + "house", + "gas", + "car", + "fish", + "boat", + "anchor", + "wreck", + "exit", + "skull", + "flag", + "camp", + "circle_x", + "deer", + "1st_aid", + "back-track" + }; +}; +#endif // GARMIN_H_INCLUDED_ diff --git a/garmin_fit.cc b/garmin_fit.cc index 3982216f8..a5fac1185 100644 --- a/garmin_fit.cc +++ b/garmin_fit.cc @@ -1151,7 +1151,8 @@ GarminFitFormat::fit_collect_track_tlr(const route_head* rte) // Recalculate odometer_distance for the whole track unless already // (properly, i.e. monotonically increasing) set double dist_sum = 0; - double prev_lat = 999, prev_lon = 999; + double prev_lat = 999; + double prev_lon = 999; double max_speed = 0; gpsbabel::DateTime prev_time; for (auto& crpt: course) { @@ -1216,8 +1217,13 @@ GarminFitFormat::fit_collect_track_tlr(const route_head* rte) } // Use current time as creation time if we have nothing better - gpsbabel::DateTime track_date_time, track_end_date_time, creation_time; - double first_lat = 999, first_lon = 999, last_lat = 999, last_lon = 999; + gpsbabel::DateTime track_date_time; + gpsbabel::DateTime track_end_date_time; + gpsbabel::DateTime creation_time; + double first_lat = 999; + double first_lon = 999; + double last_lat = 999; + double last_lon = 999; if (!course.empty()) { track_date_time = creation_time = course.front().creation_time; track_end_date_time = course.back().creation_time; diff --git a/garmin_fs.cc b/garmin_fs.cc index 1827fe120..525523005 100644 --- a/garmin_fs.cc +++ b/garmin_fs.cc @@ -20,299 +20,70 @@ */ -#include // for snprintf, sscanf -#include // for strtod - -#include // for QString, QStringLiteral -#include // for QXmlStreamWriter -#include // for CaseInsensitive - -#include "defs.h" #include "garmin_fs.h" -#include "garmin_tables.h" // for gt_switch_display_mode_value, gt_display_mode_symbol, gt_display_mode_symbol_and_comment, gt_display_mode_symbol_and_name -#include "inifile.h" // for inifile_readstr +#include // for QString +#include // for CaseInsensitive -#define MYNAME "garmin_fs" - -garmin_fs_t* -garmin_fs_alloc(const int protocol) -{ - auto* result = new garmin_fs_t; - - result->protocol = protocol; +#include "defs.h" +#include "inifile.h" // for inifile_readstr - return result; -} -garmin_fs_t* garmin_fs_t::clone() const +std::optional +garmin_fs_t::convert_category(const QString& category_name) { - auto* copy = new garmin_fs_t(*this); + std::optional category; - /* do not deep copy interlinks, only increment the reference counter */ - if (ilinks != nullptr) { - ilinks->ref_count++; + // Is the name "Category" followed by a number? Use that number. + if (category_name.startsWith(u"Category ", Qt::CaseInsensitive)) { + bool ok; + int i = category_name.mid(9).toInt(&ok); + if (ok && (i >= 1) && (i <= 16)) { + category = (1 << --i); + return category; + } } - -#ifdef GMSD_EXPERIMENTAL - memcopy(subclass, other.subclass, sizeof(subclass)); -#endif - - return copy; -} - -garmin_fs_t::~garmin_fs_t() -{ - garmin_ilink_t* links; - if ((links = ilinks) != nullptr) { - links->ref_count--; - if (links->ref_count <= 0) { - while (links != nullptr) { - garmin_ilink_t* tmp = links; - links = links->next; - xfree(tmp); + if (global_opts.inifile != nullptr) { + // Do we have a gpsbabel.ini that maps category names to category #'s? + for (int i = 0; i < 16; i++) { + QString key = QString::number(i + 1); + QString c = inifile_readstr(global_opts.inifile, kGmsdSectionCategories, key); + if (c.compare(category_name, Qt::CaseInsensitive) == 0) { + category = (1 << i); + return category; } } } + return category; } -/* GPX - out */ - -void -garmin_fs_xml_fprint(const Waypoint* waypt, - QXmlStreamWriter* writer) +QStringList +garmin_fs_t::print_categories(uint16_t categories) { - garmin_fs_t* gmsd = garmin_fs_t::find(waypt); + QStringList categoryList; - if (gmsd == nullptr) { - return; + if (categories == 0) { + return categoryList; } - /* Find out if there is at least one field set */ - QString addr = garmin_fs_t::get_addr(gmsd, ""); - if (addr.isEmpty()) { - addr = garmin_fs_t::get_city(gmsd, ""); - } - if (addr.isEmpty()) { - addr = garmin_fs_t::get_country(gmsd, ""); - } - if (addr.isEmpty()) { - addr = garmin_fs_t::get_postal_code(gmsd, ""); - } - if (addr.isEmpty()) { - addr = garmin_fs_t::get_state(gmsd, ""); - } - - QString phone = garmin_fs_t::get_phone_nr(gmsd, ""); - - if (!addr.isEmpty() || !phone.isEmpty() || - (gmsd->flags.category && gmsd->category) || - waypt->depth_has_value() || - waypt->proximity_has_value() || - waypt->temperature_has_value() || - gmsd->flags.display) { - writer->writeStartElement(QStringLiteral("extensions")); - writer->writeStartElement(QStringLiteral("gpxx:WaypointExtension")); - writer->writeNamespace(QStringLiteral("http://www.garmin.com/xmlschemas/GpxExtensions/v3"), - "gpxx"); - if (waypt->proximity_has_value()) { - writer->writeTextElement(QStringLiteral("gpxx:Proximity"), QString::number(waypt->proximity_value(), 'f', 6)); - } - if (waypt->temperature_has_value()) { - writer->writeTextElement(QStringLiteral("gpxx:Temperature"), QString::number(waypt->temperature_value(), 'f', 6)); - } - if (waypt->depth_has_value()) { - writer->writeTextElement(QStringLiteral("gpxx:Depth"), QString::number(waypt->depth_value(), 'f', 6)); - } - if (gmsd->flags.display) { - const char* cx; - switch (gmsd->display) { - case gt_display_mode_symbol: - cx = "SymbolOnly"; - break; - case gt_display_mode_symbol_and_comment: - cx = "SymbolAndDescription"; - break; - default: - cx = "SymbolAndName"; - break; - } - writer->writeTextElement(QStringLiteral("gpxx:DisplayMode"), cx); - } - if (gmsd->flags.category && gmsd->category) { - uint16_t cx = gmsd->category; - writer->writeStartElement(QStringLiteral("gpxx:Categories")); - for (int i = 0; i < 16; i++) { - if (cx & 1) { - writer->writeTextElement(QStringLiteral("gpxx:Category"), QStringLiteral("Category %1").arg(i+1)); - } - cx = cx >> 1; + for (int i = 0; i < 16; i++) { + if ((categories & 1) != 0) { + QString c; + if (global_opts.inifile != nullptr) { + QString key = QString::number(i + 1); + c = inifile_readstr(global_opts.inifile, kGmsdSectionCategories, key); } - writer->writeEndElement(); // gpxx:Categories - } - if (!addr.isEmpty()) { - QString str; - writer->writeStartElement(QStringLiteral("gpxx:Address")); - if (!(str = garmin_fs_t::get_addr(gmsd, nullptr)).isEmpty()) { - writer->writeTextElement(QStringLiteral("gpxx:StreetAddress"), str); - } - if (!(str = garmin_fs_t::get_city(gmsd, nullptr)).isEmpty()) { - writer->writeTextElement(QStringLiteral("gpxx:City"), str); - } - if (!(str = garmin_fs_t::get_state(gmsd, nullptr)).isEmpty()) { - writer->writeTextElement(QStringLiteral("gpxx:State"), str); - } - if (!(str = garmin_fs_t::get_country(gmsd, nullptr)).isEmpty()) { - writer->writeTextElement(QStringLiteral("gpxx:Country"), str); + if (c.isNull()) { + categoryList << QString::asprintf("Category %d", i+1); } - if (!(str = garmin_fs_t::get_postal_code(gmsd, nullptr)).isEmpty()) { - writer->writeTextElement(QStringLiteral("gpxx:PostalCode"), str); +// *fout << QString::asprintf("%s", gps_categories[i]); + else { + categoryList << c; } - writer->writeEndElement(); // /gpxx::Address - } - - if (!phone.isEmpty()) { - writer->writeTextElement(QStringLiteral("gpxx:PhoneNumber"), phone); - } - - writer->writeEndElement(); // /gpxx::WaypointExtension - writer->writeEndElement(); // /extensions. - } - -} - -void -garmin_fs_xml_convert(const int base_tag, int tag, const QString& qstr, Waypoint* waypt) -{ - // FIXME: eliminate C string copy/use here: - const char *cdatastr = xstrdup(qstr); - garmin_fs_t* gmsd = garmin_fs_t::find(waypt); - if (gmsd == nullptr) { - gmsd = garmin_fs_alloc(-1); - waypt->fs.FsChainAdd(gmsd); - } - - tag -= base_tag; - /* - tt_garmin_waypt_extension, -> 0 - tt_garmin_proximity, -> 1 - tt_garmin_temperature,-> 2 - tt_garmin_depth, -> 3 - tt_garmin_display_mode, -> 4 - tt_garmin_categories, -> 5 - tt_garmin_category, -> 6 - tt_garmin_addr, -> 7 - tt_garmin_city, -> 8 - tt_garmin_state, -> 9 - tt_garmin_country, -> 10 - tt_garmin_postal_code, -> 11 - tt_garmin_phone_nr, -> 12 - */ - switch (tag) { - case 1: - if (*cdatastr) { - waypt->set_proximity(strtod(cdatastr, nullptr)); - } - break; - case 2: - if (*cdatastr) { - waypt->set_temperature(strtod(cdatastr, nullptr)); - } - break; - case 3: - if (*cdatastr) { - waypt->set_depth(strtod(cdatastr, nullptr)); - } - break; - case 4: - if (case_ignore_strcmp(cdatastr, "SymbolOnly") == 0) { - garmin_fs_t::set_display(gmsd, gt_display_mode_symbol); - } else if (case_ignore_strcmp(cdatastr, "SymbolAndDescription") == 0) { - garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_comment); - } else { - garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_name); - } - break; - case 6: - if (! garmin_fs_merge_category(cdatastr, waypt)) { - // There's nothing a user can really do about this (well, they could - // create a gpsbabel.ini that mapped them to garmin category numbers - // but that feature is so obscure and used in so few outputs that - // there's no reason to alarm the user. Just silently disregard - // category names that don't map cleanly. - // warning(MYNAME ": Unable to convert category \"%s\"!\n", cdatastr); - } - break; - case 7: - garmin_fs_t::set_addr(gmsd, cdatastr); - break; - case 8: - garmin_fs_t::set_city(gmsd, cdatastr); - break; - case 9: - garmin_fs_t::set_state(gmsd, cdatastr); - break; - case 10: - garmin_fs_t::set_country(gmsd, cdatastr); - break; - case 11: - garmin_fs_t::set_postal_code(gmsd, cdatastr); - break; - case 12: - garmin_fs_t::set_phone_nr(gmsd, cdatastr); - break; - } - xfree(cdatastr); -} - -unsigned char -garmin_fs_convert_category(const char* category_name, uint16_t* category) -{ - int i; - int cat = 0; - // Is the name "Category" followed by a number? Use that number. - if ((case_ignore_strncmp(category_name, "Category ", 9) == 0) && - (1 == sscanf(category_name + 9, "%d", &i)) && - (i >= 1) && (i <= 16)) { - cat = (1 << --i); - } else if (global_opts.inifile != nullptr) { - // Do we have a gpsbabel.ini that maps category names to category #'s? - for (i = 0; i < 16; i++) { - QString key = QString::number(i + 1); - QString c = inifile_readstr(global_opts.inifile, GMSD_SECTION_CATEGORIES, key); - if (c.compare(category_name, Qt::CaseInsensitive) == 0) { - cat = (1 << i); - break; - } } + categories = categories >> 1; } - if (cat == 0) { - return 0; - } else { - *category = cat; - return 1; - } -} - -unsigned char -garmin_fs_merge_category(const char* category_name, Waypoint* waypt) -{ - uint16_t cat; - - // Attempt to get a textual category name to a category number. - if (!garmin_fs_convert_category(category_name, &cat)) { - return 0; - } - - garmin_fs_t* gmsd = garmin_fs_t::find(waypt); - cat = cat | (garmin_fs_t::get_category(gmsd, 0)); - - if (gmsd == nullptr) { - gmsd = garmin_fs_alloc(-1); - waypt->fs.FsChainAdd(gmsd); - } - garmin_fs_t::set_category(gmsd, cat); - return 1; + return categoryList; } diff --git a/garmin_fs.h b/garmin_fs.h index 25d3bbb18..5ed17e9ae 100644 --- a/garmin_fs.h +++ b/garmin_fs.h @@ -24,14 +24,14 @@ #ifndef GARMIN_FS_H #define GARMIN_FS_H -#include // for size_t -#include // for int32_t, int16_t, uint16_t +#include // for int32_t, int16_t, uint16_t +#include // for optional -#include // for QString -#include // for QXmlStreamWriter +#include // for QList +#include // for QString #include "defs.h" -#include "formspec.h" // for FsChainFind, kFsGmsd, FormatSpecificData +#include "formspec.h" // for FormatSpecificData, kFsGmsd, FormatSpecificDataList /* this order is used by most devices */ @@ -43,60 +43,40 @@ */ struct garmin_ilink_t { - int ref_count; - double lat, lon, alt; - garmin_ilink_t* next; + double lat; + double lon; + double alt; }; struct garmin_fs_flags_t { public: - garmin_fs_flags_t() : - icon(0), - wpt_class(0), - display(0), - category(0), - city(0), - state(0), - facility(0), - cc(0), - cross_road(0), - addr(0), - country(0), - phone_nr(0), - phone_nr2(0), - fax_nr(0), - postal_code(0), - email(0), - duration(0) -#ifdef GMSD_EXPERIMENTAL - , subclass(0) -#endif - {} - - unsigned int icon:1; - unsigned int wpt_class:1; - unsigned int display:1; - unsigned int category:1; - unsigned int city:1; - unsigned int state:1; - unsigned int facility:1; - unsigned int cc:1; - unsigned int cross_road:1; - unsigned int addr:1; - unsigned int country:1; - unsigned int phone_nr:1; - unsigned int phone_nr2:1; - unsigned int fax_nr:1; - unsigned int postal_code:1; - unsigned int email:1; - unsigned int duration:1; + + unsigned int icon:1{0}; + unsigned int wpt_class:1{0}; + unsigned int display:1{0}; + unsigned int category:1{0}; + unsigned int city:1{0}; + unsigned int state:1{0}; + unsigned int facility:1{0}; + unsigned int cc:1{0}; + unsigned int cross_road:1{0}; + unsigned int addr:1{0}; + unsigned int country:1{0}; + unsigned int phone_nr:1{0}; + unsigned int phone_nr2:1{0}; + unsigned int fax_nr:1{0}; + unsigned int postal_code:1{0}; + unsigned int email:1{0}; + unsigned int duration:1{0}; #ifdef GMSD_EXPERIMENTAL - unsigned int subclass:1; + unsigned int subclass:1{0}; #endif }; class garmin_fs_t : public FormatSpecificData { public: + /* Data Members */ + garmin_fs_flags_t flags; int protocol{0}; /* ... used by device (-1 is MapSource) */ @@ -117,28 +97,32 @@ class garmin_fs_t : public FormatSpecificData { QString fax_nr; /* fax number */ QString postal_code; /* postal code */ QString email; /* email address */ - unsigned int duration; /* expected travel time to next route point, in seconds, only when auto-routed */ + unsigned int duration{0}; /* expected travel time to next route point, in seconds, only when auto-routed */ - garmin_ilink_t* ilinks{nullptr}; + QList ilinks; #ifdef GMSD_EXPERIMENTAL char subclass[22]{}; #endif -public: + /* Special Member Functions */ + garmin_fs_t() : FormatSpecificData(kFsGmsd) {} -private: - garmin_fs_t(const garmin_fs_t& other) = default; -public: - garmin_fs_t& operator=(const garmin_fs_t& rhs) = delete; /* not implemented */ - garmin_fs_t(garmin_fs_t&&) = delete; /* not implemented */ - garmin_fs_t& operator=(garmin_fs_t&&) = delete; /* not implemented */ - ~garmin_fs_t() override; + explicit garmin_fs_t(int p) : garmin_fs_t() {protocol = p;} + + /* Member Functions */ + + garmin_fs_t* clone() const override + { + return new garmin_fs_t(*this); + } - garmin_fs_t* clone() const override; static garmin_fs_t* find(const Waypoint* wpt) { return reinterpret_cast(wpt->fs.FsChainFind(kFsGmsd)); } + static std::optional convert_category(const QString& category_name); + static QStringList print_categories(uint16_t categories); + #define GEN_GMSD_METHODS(field) \ static bool has_##field(const garmin_fs_t* gmsd) \ { \ @@ -214,24 +198,10 @@ class garmin_fs_t : public FormatSpecificData { GEN_GMSD_STR_METHODS(email) #undef GEN_GMSD_STR_METHODS -}; - -garmin_fs_t* garmin_fs_alloc(int protocol); -void garmin_fs_destroy(void* fs); -void garmin_fs_copy(void** dest, const void* src); - -/* for GPX */ -void garmin_fs_xml_convert(int base_tag, int tag, const QString& qstr, Waypoint* waypt); -void garmin_fs_xml_fprint(const Waypoint* waypt, QXmlStreamWriter*); -/* common garmin_fs utilities */ - -/* ..convert_category: returns 1=OK; 0=Unable to convert category */ -unsigned char garmin_fs_convert_category(const char* category_name, uint16_t* category); - -/* ..merge_category: returns 1=OK; 0=Unable to convert category */ -unsigned char garmin_fs_merge_category(const char* category_name, Waypoint* waypt); - -#define GMSD_SECTION_CATEGORIES "Garmin Categories" +private: + /* Constants */ + static constexpr char kGmsdSectionCategories[] = "Garmin Categories"; +}; #endif diff --git a/garmin_gpi.cc b/garmin_gpi.cc index 473871bb2..745f68c2f 100644 --- a/garmin_gpi.cc +++ b/garmin_gpi.cc @@ -41,7 +41,7 @@ #include "defs.h" #include "formspec.h" // for FormatSpecificDataList -#include "garmin_fs.h" // for garmin_fs_t, garmin_fs_alloc +#include "garmin_fs.h" // for garmin_fs_t #include "gbfile.h" // for gbfputint32, gbfgetint32, gbfgetint16, gbfputint16, gbfgetc, gbfputc, gbfread, gbftell, gbfwrite, gbfseek, gbfclose, gbfopen_le, gbfgetuint16, gbsize_t, gbfile #include "jeeps/gpsmath.h" // for GPS_Math_Deg_To_Semi, GPS_Math_Semi_To_Deg @@ -76,7 +76,7 @@ GarminGPIFormat::gpi_gmsd_init(Waypoint* wpt) } garmin_fs_t* gmsd = garmin_fs_t::find(wpt); if (gmsd == nullptr) { - gmsd = garmin_fs_alloc(-1); + gmsd = new garmin_fs_t(-1); wpt->fs.FsChainAdd(gmsd); } return gmsd; @@ -159,7 +159,8 @@ GarminGPIFormat::gpi_read_string(const char* field) const void GarminGPIFormat::read_header() { - int len, i; + int len; + int i; i = gbfgetint32(fin); if (i != 0) { @@ -235,7 +236,7 @@ GarminGPIFormat::read_poi(const int sz, const int tag) len = gbfgetint32(fin); /* sub-header size */ } if (GPI_DBG) { - warning("poi sublen = %1$d (0x%1$x)\n", len); + warning("poi sublen = %d (0x%x)\n", len, len); } (void) len; int pos = gbftell(fin); @@ -279,12 +280,12 @@ GarminGPIFormat::read_poi_list(const int sz) int pos = gbftell(fin); if (GPI_DBG) { PP; - warning("> reading poi list (-> %1$x / %1$d )\n", pos + sz); + warning("> reading poi list (-> %x / %d )\n", pos + sz, pos + sz); } PP; int i = gbfgetint32(fin); /* mostly 23 (0x17) */ if (GPI_DBG) { - warning("list sublen = %1$d (0x%1$x)\n", i); + warning("list sublen = %d (0x%x)\n", i, i); } (void) i; @@ -317,7 +318,7 @@ GarminGPIFormat::read_poi_group(const int sz, const int tag) int pos = gbftell(fin); if (GPI_DBG) { PP; - warning("> reading poi group (-> %1$x / %1$d)\n", pos + sz); + warning("> reading poi group (-> %x / %d)\n", pos + sz, pos + sz); } if (tag == 0x80009) { PP; @@ -452,7 +453,7 @@ GarminGPIFormat::read_tag(const char* caller, const int tag, Waypoint* wpt) case 0x8000b: /* address (street/city...) */ (void) gbfgetint32(fin); - // FALLTHROUGH + [[fallthrough]]; case 0xb: /* as seen in German POI files. */ PP; mask = gbfgetint16(fin); /* address fields mask */ @@ -700,7 +701,7 @@ GarminGPIFormat::wdata_compute_size(writer_data_t* data) const res = 23; /* bounds, ... of tag 0x80008 */ foreach (Waypoint* wpt, data->waypt_list) { - garmin_fs_t* gmsd; + const garmin_fs_t* gmsd; res += 12; /* tag/sz/sub-sz */ res += 19; /* poi fixed size */ @@ -1044,7 +1045,7 @@ GarminGPIFormat::enum_waypt_cb(const Waypoint* ref) const auto* wpt = new Waypoint(*ref); if (*opt_unique == '1') { - wpt->shortname = mkshort(short_h, wpt->shortname); + wpt->shortname = short_h->mkshort(wpt->shortname); } wdata_add_wpt(wdata, wpt); @@ -1053,9 +1054,11 @@ GarminGPIFormat::enum_waypt_cb(const Waypoint* ref) const void GarminGPIFormat::load_bitmap_from_file(const char* fname, const unsigned char** data, int* data_sz) { - int i, sz; + int i; + int sz; int dest_bpp; - int src_line_sz, dest_line_sz; + int src_line_sz; + int dest_line_sz; bmp_header_t src_h; gpi_bitmap_header_t* dest_h; unsigned char* ptr; @@ -1145,7 +1148,6 @@ GarminGPIFormat::load_bitmap_from_file(const char* fname, const unsigned char** } ptr = (unsigned char*) xmalloc(sz); - const unsigned char* const startptr = ptr; dest_h = (gpi_bitmap_header_t*)ptr; *data = ptr; *data_sz = sz; @@ -1176,8 +1178,8 @@ GarminGPIFormat::load_bitmap_from_file(const char* fname, const unsigned char** unsigned char* p = ptr; for (j = 0; j < src_h.width; j++) { - int color = (int32_t)gbfgetint16(f) | (gbfgetc(f) << 16); - le_write32(p, color); + gbfread(p, 1, 3, f); + p[3] = 0x00; p += 4; } for (j = (src_h.width * src_h.bpp) / 8; j < src_line_sz; j++) { @@ -1202,10 +1204,6 @@ GarminGPIFormat::load_bitmap_from_file(const char* fname, const unsigned char** } } - auto bytesout = ptr - startptr; - if (bytesout != *data_sz) { - warning(MYNAME ": Code error in load_bitmap_from_file, expected output size %d, actual output %td.", *data_sz, bytesout); - } gbfclose(f); } @@ -1252,15 +1250,15 @@ GarminGPIFormat::wr_init(const QString& fname) fout = gbfopen_le(fname, "wb", MYNAME); - short_h = mkshort_new_handle(); + short_h = new MakeShort; - setshort_length(short_h, 1024); - setshort_badchars(short_h, "\r\n"); - setshort_mustupper(short_h, 0); - setshort_mustuniq(short_h, 1); - setshort_whitespace_ok(short_h, 1); - setshort_repeating_whitespace_ok(short_h, 0); - setshort_defname(short_h, "POI"); + short_h->set_length(1024); + short_h->set_badchars("\r\n"); + short_h->set_mustupper(false); + short_h->set_mustuniq(true); + short_h->set_whitespace_ok(true); + short_h->set_repeating_whitespace_ok(false); + short_h->set_defname("POI"); codepage = 0; @@ -1325,7 +1323,8 @@ void GarminGPIFormat::wr_deinit() { wdata_free(wdata); - mkshort_del_handle(&short_h); + delete short_h; + short_h = nullptr; gbfclose(fout); if ((opt_sleep) && !gpsbabel_testmode()) { /* don't sleep during 'testo' */ diff --git a/garmin_gpi.h b/garmin_gpi.h index d13920184..cdc972eb3 100644 --- a/garmin_gpi.h +++ b/garmin_gpi.h @@ -55,10 +55,11 @@ #include // for int32_t, int16_t, uint16_t #include // for time_t -#include "defs.h" // for arglist_t, ARG_NOMINMAX, ff_cap, Waypoint, ARGTYPE_BOOL, ARGTYPE_STRING, ff_cap_none, ARGTYPE_FILE, ARGTYPE_INT, bounds, ff_cap_read, ff_cap_write, ff_type, ff_type_file, short_handle +#include "defs.h" // for arglist_t, ARG_NOMINMAX, ff_cap, Waypoint, ARGTYPE_BOOL, ARGTYPE_STRING, ff_cap_none, ARGTYPE_FILE, ARGTYPE_INT, bounds, ff_cap_read, ff_cap_write, ff_type, ff_type_file #include "format.h" // for Format #include "garmin_fs.h" // for garmin_fs_t #include "gbfile.h" // for gbfile +#include "mkshort.h" // for MakeShort class GarminGPIFormat : public Format @@ -292,11 +293,11 @@ class GarminGPIFormat : public Format static bool compare_wpt_cb(const Waypoint* a, const Waypoint* b); static char compare_strings(const QString& s1, const QString& s2); static writer_data_t* wdata_alloc(); - static void wdata_free(GarminGPIFormat::writer_data_t* data); - static void wdata_add_wpt(GarminGPIFormat::writer_data_t* data, Waypoint* wpt); - void wdata_check(GarminGPIFormat::writer_data_t* data) const; - int wdata_compute_size(GarminGPIFormat::writer_data_t* data) const; - void wdata_write(const GarminGPIFormat::writer_data_t* data) const; + static void wdata_free(writer_data_t* data); + static void wdata_add_wpt(writer_data_t* data, Waypoint* wpt); + void wdata_check(writer_data_t* data) const; + int wdata_compute_size(writer_data_t* data) const; + void wdata_write(const writer_data_t* data) const; void write_category(const char* unused, const unsigned char* image, int image_sz) const; void write_header() const; void enum_waypt_cb(const Waypoint* ref) const; @@ -377,7 +378,7 @@ class GarminGPIFormat : public Format uint16_t codepage{}; /* code-page, e.g. 1252, 65001 */ reader_data_t* rdata{}; writer_data_t* wdata{}; - short_handle short_h{}; + MakeShort* short_h{}; char units{}; time_t gpi_timestamp = 0; QTextCodec* codec{nullptr}; diff --git a/garmin_txt.cc b/garmin_txt.cc index 5fd72a870..fdd4fdf46 100644 --- a/garmin_txt.cc +++ b/garmin_txt.cc @@ -20,92 +20,60 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#if CSVFMTS_ENABLED -#include "defs.h" +#include "garmin_txt.h" -#if CSVFMTS_ENABLED #include // for for_each, sort -#include // for array +#include // for array, array<>::iterator #include // for toupper #include // for fabs, floor #include // for uint16_t #include // for sscanf, fprintf, snprintf, stderr #include // for abs #include // for strstr, strlen -#include // for time_t, gmtime, localtime, strftime -#include // for pair, make_pair +#include // for gmtime, time_t, localtime, strftime, tm +#include // for optional +#include // for add_const_t +#include // for pair, as_const, make_pair #include // for QByteArray #include // for QChar, QChar::Other_Control #include // for QDateTime -#include // for QIODevice, QIODevice::ReadOnly, QIODevice::WriteOnly +#include // for QDebug +#include // for QIODevice, QIODeviceBase::ReadOnly, QIODeviceBase::WriteOnly #include // for QList, QList<>::const_iterator #include // for QString, operator!= #include // for QStringList +#include // for qMakeStringPrivate, QStringLiteral #include // for QTextStream #include // for QVector #include // for CaseInsensitive #include // for qRound, qPrintable +#include "defs.h" #include "csv_util.h" // for csv_linesplit #include "formspec.h" // for FormatSpecificDataList -#include "garmin_fs.h" // for garmin_fs_t, garmin_fs_alloc, garmin_fs_convert_category, GMSD_SECTION_CATEGORIES +#include "garmin_fs.h" // for garmin_fs_t #include "garmin_tables.h" // for gt_display_modes_e, gt_find_desc_from_icon_number, gt_find_icon_number_from_desc, gt_get_mps_grid_longname, gt_lookup_datum_index, gt_lookup_grid_type, GDB, gt_get_icao_cc, gt_get_icao_country, gt_get_mps_datum_name, gt_waypt_class_names, GT_DISPLAY_MODE... -#include "inifile.h" // for inifile_readstr -#include "jeeps/gpsmath.h" // for GPS_Math_Known_Datum_To_UTM_EN, GPS_Math_WGS84_To_Known_Datum_M, GPS_Math_WGS84_To_Swiss_EN, GPS_Math_WGS84_To_UKOSMap_M +#include "jeeps/gpsmath.h" // for GPS_Math_Known_Datum_To_UTM_EN, GPS_Math_WGS84_To_Known_Datum_M, GPS_Math_WGS84_To_Swiss_EN, GPS_Math_WGS84_To_UKOSMap_H #include "src/core/datetime.h" // for DateTime -#include "src/core/logging.h" // for Fatal +#include "src/core/logging.h" // for FatalMsg #include "src/core/textstream.h" // for TextStream #define MYNAME "garmin_txt" -struct gtxt_flags_t { - unsigned int metric:1; - unsigned int celsius:1; - unsigned int utc:1; - unsigned int enum_waypoints:1; - unsigned int route_header_written:1; - unsigned int track_header_written:1; -}; - -static gpsbabel::TextStream* fin = nullptr; -static gpsbabel::TextStream* fout = nullptr; -static route_head* current_trk; -static route_head* current_rte; -static int waypoints; -static int routepoints; -static const Waypoint** wpt_a; -static int wpt_a_ct; -static grid_type grid_index; -static int datum_index; -static const char* datum_str; -static int current_line; -static QString date_time_format; -static int precision = 3; -static time_t utc_offs = 0; -static gtxt_flags_t gtxt_flags; - -enum header_type { - waypt_header = 0, - rtept_header, - trkpt_header, - route_header, - track_header, - unknown_header +const QVector GarminTxtFormat::headers = { + "Name\tDescription\tType\tPosition\tAltitude\tDepth\tProximity\tTemperature\t" + "Display Mode\tColor\tSymbol\tFacility\tCity\tState\tCountry\t" + "Date Modified\tLink\tCategories", + "Waypoint Name\tDistance\tLeg Length\tCourse", + "Position\tTime\tAltitude\tDepth\tTemperature\tLeg Length\tLeg Time\tLeg Speed\tLeg Course", + "Name\tLength\tCourse\tWaypoints\tLink", + "Name\tStart Time\tElapsed Time\tLength\tAverage Speed\tLink" }; -inline header_type& operator++(header_type& s) // prefix -{ - return s = static_cast(s + 1); -} -inline header_type operator++(header_type& s, int) // postfix -{ - header_type ret(s); - ++s; - return ret; -} - inline gt_display_modes_e& operator++(gt_display_modes_e& s) // prefix { return s = static_cast(s + 1); @@ -117,78 +85,22 @@ inline gt_display_modes_e operator++(gt_display_modes_e& s, int) // postfix return ret; } -static std::array>, unknown_header> header_mapping_info; -static QStringList header_column_names; - -static constexpr double kGarminUnknownAlt = 1.0e25; -static constexpr char kDefaultDateFormat[] = "dd/mm/yyyy"; -static constexpr char kDefaultTimeFormat[] = "HH:mm:ss"; - -static inline bool is_valid_alt(double alt) +bool GarminTxtFormat::is_valid_alt(double alt) { return (alt != unknown_alt) && (alt < kGarminUnknownAlt); } -static char* opt_datum = nullptr; -static char* opt_dist = nullptr; -static char* opt_temp = nullptr; -static char* opt_date_format = nullptr; -static char* opt_time_format = nullptr; -static char* opt_precision = nullptr; -static char* opt_utc = nullptr; -static char* opt_grid = nullptr; - -static -QVector garmin_txt_args = { - {"date", &opt_date_format, "Read/Write date format (i.e. yyyy/mm/dd)", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, - {"datum", &opt_datum, "GPS datum (def. WGS 84)", "WGS 84", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, - {"dist", &opt_dist, "Distance unit [m=metric, s=statute]", "m", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, - {"grid", &opt_grid, "Write position using this grid.", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, - {"prec", &opt_precision, "Precision of coordinates", "3", ARGTYPE_INT, ARG_NOMINMAX, nullptr}, - {"temp", &opt_temp, "Temperature unit [c=Celsius, f=Fahrenheit]", "c", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, - {"time", &opt_time_format, "Read/Write time format (i.e. HH:mm:ss xx)", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, - {"utc", &opt_utc, "Write timestamps with offset x to UTC time", nullptr, ARGTYPE_INT, "-23", "+23", nullptr}, -}; - -class PathInfo -{ -public: - double length {0}; - time_t start {0}; - time_t time {0}; - double speed {0}; - double total {0}; - int count {0}; - const Waypoint* prev_wpt {nullptr}; - const Waypoint* first_wpt {nullptr}; - const Waypoint* last_wpt {nullptr}; -}; - -static PathInfo* route_info; -static int route_idx; -static PathInfo* cur_info; - -static const QVector headers = { - "Name\tDescription\tType\tPosition\tAltitude\tDepth\tProximity\tTemperature\t" - "Display Mode\tColor\tSymbol\tFacility\tCity\tState\tCountry\t" - "Date Modified\tLink\tCategories", - "Waypoint Name\tDistance\tLeg Length\tCourse", - "Position\tTime\tAltitude\tDepth\tTemperature\tLeg Length\tLeg Time\tLeg Speed\tLeg Course", - "Name\tLength\tCourse\tWaypoints\tLink", - "Name\tStart Time\tElapsed Time\tLength\tAverage Speed\tLink" -}; - /* helpers */ -static const char* -get_option_val(const char* option, const char* def) +const char* +GarminTxtFormat::get_option_val(const char* option, const char* def) { const char* c = (option != nullptr) ? option : def; return c; } -static void -init_date_and_time_format() +void +GarminTxtFormat::init_date_and_time_format() { // This is old, and weird, code.. date_time_format is a global that's // explicitly malloced and freed elsewhere. This isn't very C++ at all, @@ -202,12 +114,12 @@ init_date_and_time_format() date_time_format = QStringLiteral("%1 %2").arg(d1, t1); } -static void -convert_datum(const Waypoint* wpt, double* dest_lat, double* dest_lon) +void +GarminTxtFormat::convert_datum(const Waypoint* wpt, double* dest_lat, double* dest_lon) const { double alt; - if (datum_index == kDautmWGS84) { + if (datum_index == kDatumWGS84) { *dest_lat = wpt->latitude; *dest_lon = wpt->longitude; } else GPS_Math_WGS84_To_Known_Datum_M(wpt->latitude, wpt->longitude, 0.0, @@ -218,10 +130,10 @@ convert_datum(const Waypoint* wpt, double* dest_lat, double* dest_lon) /* Waypoint preparation */ -static void -enum_waypt_cb(const Waypoint* wpt) +void +GarminTxtFormat::enum_waypt_cb(const Waypoint* wpt) { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); int wpt_class = garmin_fs_t::get_wpt_class(gmsd, 0); if (wpt_class < 0x80) { if (gtxt_flags.enum_waypoints) { /* enumerate only */ @@ -244,21 +156,21 @@ enum_waypt_cb(const Waypoint* wpt) /* common route and track pre-work */ -static void -prework_hdr_cb(const route_head*) +void +GarminTxtFormat::prework_hdr_cb(const route_head* /*unused*/) { cur_info = &route_info[route_idx]; } -static void -prework_tlr_cb(const route_head*) +void +GarminTxtFormat::prework_tlr_cb(const route_head* /*unused*/) { cur_info->last_wpt = cur_info->prev_wpt; route_idx++; } -static void -prework_wpt_cb(const Waypoint* wpt) +void +GarminTxtFormat::prework_wpt_cb(const Waypoint* wpt) { const Waypoint* prev = cur_info->prev_wpt; @@ -277,13 +189,17 @@ prework_wpt_cb(const Waypoint* wpt) /* output helpers */ -static void -print_position(const Waypoint* wpt) +void +GarminTxtFormat::print_position(const Waypoint* wpt) { int valid = 1; - double lat, lon, north, east; + double lat; + double lon; + double north; + double east; int zone; - char map[3], zonec; + char map[3]; + char zonec; convert_datum(wpt, &lat, &lon); @@ -327,7 +243,7 @@ print_position(const Waypoint* wpt) case grid_bng: - valid = GPS_Math_WGS84_To_UKOSMap_M(wpt->latitude, wpt->longitude, &east, &north, map); + valid = GPS_Math_WGS84_To_UKOSMap_H(wpt->latitude, wpt->longitude, &east, &north, map); if (valid) { *fout << QString::asprintf("%s %5.0f %5.0f\t", map, east, north); } @@ -363,8 +279,8 @@ print_position(const Waypoint* wpt) } } -static void -print_date_and_time(const time_t time, const bool time_only) +void +GarminTxtFormat::print_date_and_time(const time_t time, const bool time_only) { std::tm tm{}; char tbuf[32]; @@ -390,38 +306,17 @@ print_date_and_time(const time_t time, const bool time_only) *fout << "\t"; } -static void -print_categories(uint16_t categories) +void +GarminTxtFormat::print_categories(uint16_t categories) { - if (categories == 0) { - return; - } - - int count = 0; - for (int i = 0; i < 16; i++) { - if ((categories & 1) != 0) { - QString c; - if (global_opts.inifile != nullptr) { - QString key = QString::number(i + 1); - c = inifile_readstr(global_opts.inifile, GMSD_SECTION_CATEGORIES, key); - } - - *fout << QString::asprintf("%s", (count++ > 0) ? "," : ""); - if (c.isNull()) { - *fout << QString::asprintf("Category %d", i+1); - } -// *fout << QString::asprintf("%s", gps_categories[i]); - else { - *fout << c; - } - - } - categories = categories >> 1; + const QStringList categoryList = garmin_fs_t::print_categories(categories); + if (!categoryList.isEmpty()) { + *fout << categoryList.join(','); } } -static void -print_course(const Waypoint* A, const Waypoint* B) /* seems to be okay */ +void +GarminTxtFormat::print_course(const Waypoint* A, const Waypoint* B) /* seems to be okay */ { if ((A != nullptr) && (B != nullptr) && (A != B)) { int course = qRound(waypt_course(A, B)); @@ -429,8 +324,8 @@ print_course(const Waypoint* A, const Waypoint* B) /* seems to be okay */ } } -static void -print_distance(const double distance, const bool no_scale, const bool with_tab, const int decis) +void +GarminTxtFormat::print_distance(const double distance, const bool no_scale, const bool with_tab, const int decis) { double dist = distance; @@ -464,8 +359,8 @@ print_distance(const double distance, const bool no_scale, const bool with_tab, } } -static void -print_speed(const double distance, const time_t time) +void +GarminTxtFormat::print_speed(const double distance, const time_t time) { double dist = distance; const char* unit; @@ -495,8 +390,8 @@ print_speed(const double distance, const time_t time) *fout << "\t"; } -static void -print_temperature(const float temperature) +void +GarminTxtFormat::print_temperature(const float temperature) { if (gtxt_flags.celsius) { *fout << QString::asprintf("%.f C", temperature); @@ -505,8 +400,8 @@ print_temperature(const float temperature) } } -static void -print_string(const char* fmt, const QString& string) +void +GarminTxtFormat::print_string(const char* fmt, const QString& string) { /* remove unwanted characters from source string */ QString cleanstring; @@ -523,12 +418,12 @@ print_string(const char* fmt, const QString& string) /* main cb's */ -static void -write_waypt(const Waypoint* wpt) +void +GarminTxtFormat::write_waypt(const Waypoint* wpt) { const char* wpt_type; - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); int i = garmin_fs_t::get_display(gmsd, 0); if (i > GT_DISPLAY_MODE_MAX) { @@ -599,7 +494,7 @@ write_waypt(const Waypoint* wpt) print_string("%s\t", (country != nullptr) ? country : ""); print_date_and_time(wpt->GetCreationTime().toTime_t(), false); if (wpt->HasUrlLink()) { - UrlLink l = wpt->GetUrlLink(); + const UrlLink& l = wpt->GetUrlLink(); print_string("%s\t", l.url_); } else { print_string("%s\t", ""); @@ -609,8 +504,8 @@ write_waypt(const Waypoint* wpt) *fout << "\r\n"; } -static void -route_disp_hdr_cb(const route_head* rte) +void +GarminTxtFormat::route_disp_hdr_cb(const route_head* rte) { cur_info = &route_info[route_idx]; cur_info->prev_wpt = nullptr; @@ -635,14 +530,14 @@ route_disp_hdr_cb(const route_head* rte) *fout << QStringLiteral("\r\nHeader\t%1\r\n\r\n").arg(headers[rtept_header]); } -static void -route_disp_tlr_cb(const route_head*) +void +GarminTxtFormat::route_disp_tlr_cb(const route_head* /*unused*/) { route_idx++; } -static void -route_disp_wpt_cb(const Waypoint* wpt) +void +GarminTxtFormat::route_disp_wpt_cb(const Waypoint* wpt) { const Waypoint* prev = cur_info->prev_wpt; @@ -663,8 +558,8 @@ route_disp_wpt_cb(const Waypoint* wpt) cur_info->prev_wpt = wpt; } -static void -track_disp_hdr_cb(const route_head* track) +void +GarminTxtFormat::track_disp_hdr_cb(const route_head* track) { cur_info = &route_info[route_idx]; cur_info->prev_wpt = nullptr; @@ -690,14 +585,14 @@ track_disp_hdr_cb(const route_head* track) *fout << QStringLiteral("\r\n\r\nHeader\t%1\r\n\r\n").arg(headers[trkpt_header]); } -static void -track_disp_tlr_cb(const route_head*) +void +GarminTxtFormat::track_disp_tlr_cb(const route_head* /*unused*/) { route_idx++; } -static void -track_disp_wpt_cb(const Waypoint* wpt) +void +GarminTxtFormat::track_disp_wpt_cb(const Waypoint* wpt) { const Waypoint* prev = cur_info->prev_wpt; time_t delta; @@ -740,8 +635,30 @@ track_disp_wpt_cb(const Waypoint* wpt) * %%% global callbacks called by gpsbabel main process %%% * *******************************************************************************/ -static void -garmin_txt_wr_init(const QString& fname) +void +GarminTxtFormat::garmin_txt_utc_option() +{ + if (opt_utc != nullptr) { + if (case_ignore_strcmp(opt_utc, "utc") == 0) { + utc_offs = 0; + } else { + utc_offs = xstrtoi(opt_utc, nullptr, 10); + } + utc_offs *= (60 * 60); + gtxt_flags.utc = 1; + } +} + +void +GarminTxtFormat::garmin_txt_adjust_time(QDateTime& dt) const +{ + if (gtxt_flags.utc) { + dt = dt.toUTC().addSecs(dt.offsetFromUtc() - utc_offs); + } +} + +void +GarminTxtFormat::wr_init(const QString& fname) { gtxt_flags = {}; @@ -780,25 +697,17 @@ garmin_txt_wr_init(const QString& fname) datum_index = kDatumOSGB36; break; case grid_swiss: /* force datum to WGS84 */ - datum_index = kDautmWGS84; + datum_index = kDatumWGS84; break; default: datum_index = gt_lookup_datum_index(datum_str, MYNAME); } - if (opt_utc != nullptr) { - if (case_ignore_strcmp(opt_utc, "utc") == 0) { - utc_offs = 0; - } else { - utc_offs = xstrtoi(opt_utc, nullptr, 10); - } - utc_offs *= (60 * 60); - gtxt_flags.utc = 1; - } + garmin_txt_utc_option(); } -static void -garmin_txt_wr_deinit() +void +GarminTxtFormat::wr_deinit() { fout->close(); delete fout; @@ -807,11 +716,42 @@ garmin_txt_wr_deinit() date_time_format.squeeze(); } -static void -garmin_txt_write() +void +GarminTxtFormat::write() { + auto enum_waypt_cb_lambda = [this](const Waypoint* waypointp)->void { + enum_waypt_cb(waypointp); + }; + auto prework_hdr_cb_lambda = [this](const route_head* rte)->void { + prework_hdr_cb(rte); + }; + auto prework_tlr_cb_lambda = [this](const route_head* rte)->void { + prework_tlr_cb(rte); + }; + auto prework_wpt_cb_lambda = [this](const Waypoint* waypointp)->void { + prework_wpt_cb(waypointp); + }; + auto route_disp_hdr_cb_lambda = [this](const route_head* rte)->void { + route_disp_hdr_cb(rte); + }; + auto route_disp_tlr_cb_lambda = [this](const route_head* rte)->void { + route_disp_tlr_cb(rte); + }; + auto route_disp_wpt_cb_lambda = [this](const Waypoint* waypointp)->void { + route_disp_wpt_cb(waypointp); + }; + auto track_disp_hdr_cb_lambda = [this](const route_head* rte)->void { + track_disp_hdr_cb(rte); + }; + auto track_disp_tlr_cb_lambda = [this](const route_head* rte)->void { + track_disp_tlr_cb(rte); + }; + auto track_disp_wpt_cb_lambda = [this](const Waypoint* waypointp)->void { + track_disp_wpt_cb(waypointp); + }; + QString grid_str = gt_get_mps_grid_longname(grid_index, MYNAME); - grid_str = grid_str.replace('*', "°"); + grid_str = grid_str.replace('*', u'°'); *fout << "Grid\t" << grid_str << "\r\n"; datum_str = gt_get_mps_datum_name(datum_index); @@ -819,15 +759,15 @@ garmin_txt_write() waypoints = 0; gtxt_flags.enum_waypoints = 1; /* enum all waypoints */ - waypt_disp_all(enum_waypt_cb); - route_disp_all(nullptr, nullptr, enum_waypt_cb); + waypt_disp_all(enum_waypt_cb_lambda); + route_disp_all(nullptr, nullptr, enum_waypt_cb_lambda); gtxt_flags.enum_waypoints = 0; if (waypoints > 0) { wpt_a_ct = 0; wpt_a = new const Waypoint*[waypoints] {}; - waypt_disp_all(enum_waypt_cb); - route_disp_all(nullptr, nullptr, enum_waypt_cb); + waypt_disp_all(enum_waypt_cb_lambda); + route_disp_all(nullptr, nullptr, enum_waypt_cb_lambda); auto sort_waypt_lambda = [](const Waypoint* wa, const Waypoint* wb)->bool { return wa->shortname.compare(wb->shortname, Qt::CaseInsensitive) < 0; }; @@ -842,10 +782,11 @@ garmin_txt_write() route_idx = 0; route_info = new PathInfo[route_count()]; routepoints = 0; - route_disp_all(prework_hdr_cb, prework_tlr_cb, prework_wpt_cb); + route_disp_all(prework_hdr_cb_lambda, prework_tlr_cb_lambda, prework_wpt_cb_lambda); + if (routepoints > 0) { route_idx = 0; - route_disp_all(route_disp_hdr_cb, route_disp_tlr_cb, route_disp_wpt_cb); + route_disp_all(route_disp_hdr_cb_lambda, route_disp_tlr_cb_lambda, route_disp_wpt_cb_lambda); } delete[] route_info; route_info = nullptr; @@ -854,11 +795,11 @@ garmin_txt_write() route_idx = 0; route_info = new PathInfo[track_count()]; routepoints = 0; - track_disp_all(prework_hdr_cb, prework_tlr_cb, prework_wpt_cb); + track_disp_all(prework_hdr_cb_lambda, prework_tlr_cb_lambda, prework_wpt_cb_lambda); if (routepoints > 0) { route_idx = 0; - track_disp_all(track_disp_hdr_cb, track_disp_tlr_cb, track_disp_wpt_cb); + track_disp_all(track_disp_hdr_cb_lambda, track_disp_tlr_cb_lambda, track_disp_wpt_cb_lambda); } delete[] route_info; } @@ -867,8 +808,8 @@ garmin_txt_write() /* helpers */ -static void -free_headers() +void +GarminTxtFormat::free_headers() { std::for_each(header_mapping_info.begin(), header_mapping_info.end(), [](auto& list)->void { list.clear(); }); @@ -877,8 +818,8 @@ free_headers() // Super simple attempt to convert strftime/strptime spec to Qt spec. // This misses a LOT of cases and vagaries, but the reality is that we // see very few date formats here. -static QString -strftime_to_timespec(const char* s) +QString +GarminTxtFormat::strftime_to_timespec(const char* s) { QString q; int l = strlen(s); @@ -902,7 +843,7 @@ strftime_to_timespec(const char* s) q += "yyyy"; continue; case 'H': - q += "hh"; + q += "HH"; continue; case 'M': q += "mm"; @@ -931,8 +872,11 @@ strftime_to_timespec(const char* s) case 'F': q += "yyyy-MM-dd"; continue; + case 'p': + q += "AP"; + continue; default: - q += s[i+1]; + warning(MYNAME ": omitting unknown strptime conversion \"%%%c\" in \"%s\"\n", s[i], s); break; } } @@ -948,15 +892,15 @@ strftime_to_timespec(const char* s) /* data parsers */ -static QDateTime -parse_date_and_time(const QString& str) +QDateTime +GarminTxtFormat::parse_date_and_time(const QString& str) { QString timespec = strftime_to_timespec(CSTR(date_time_format)); return QDateTime::fromString(QString(str).trimmed(), timespec); } -static uint16_t -parse_categories(const QString& str) +uint16_t +GarminTxtFormat::parse_categories(const QString& str) const { uint16_t res = 0; @@ -964,19 +908,18 @@ parse_categories(const QString& str) for (const auto& catstring : catstrings) { QString cin = catstring.trimmed(); if (!cin.isEmpty()) { - uint16_t val; - if (!garmin_fs_convert_category(CSTR(cin), &val)) { + if (std::optional cat = garmin_fs_t::convert_category(cin); !cat.has_value()) { warning(MYNAME ": Unable to convert category \"%s\" at line %d!\n", qPrintable(cin), current_line); } else { - res = res | val; + res = res | *cat; } } } return res; } -static bool -parse_temperature(const QString& str, double* temperature) +bool +GarminTxtFormat::parse_temperature(const QString& str, double* temperature) const { double value; unsigned char unit; @@ -1004,8 +947,8 @@ parse_temperature(const QString& str, double* temperature) return false; } -static void -parse_header(const QStringList& lineparts) +void +GarminTxtFormat::parse_header(const QStringList& lineparts) { header_column_names.clear(); for (const auto& name : lineparts) { @@ -1013,8 +956,8 @@ parse_header(const QStringList& lineparts) } } -static bool -parse_display(const QString& str, int* val) +bool +GarminTxtFormat::parse_display(const QString& str, int* val) const { if (str.isEmpty()) { return false; @@ -1030,8 +973,8 @@ parse_display(const QString& str, int* val) return false; } -static void -bind_fields(const header_type ht) +void +GarminTxtFormat::bind_fields(const header_type ht) { if ((grid_index < 0) || (datum_index < 0)) { fatal(MYNAME ": Incomplete or invalid file header!"); @@ -1046,7 +989,7 @@ bind_fields(const header_type ht) const QStringList altheader = headers.at(ht).toUpper().split('\t'); int i = -1; - for (const auto& name : qAsConst(header_column_names)) { + for (const auto& name : std::as_const(header_column_names)) { i++; int field_idx = altheader.indexOf(name); @@ -1063,8 +1006,8 @@ bind_fields(const header_type ht) header_column_names.clear(); } -static void -parse_grid(const QStringList& lineparts) +void +GarminTxtFormat::parse_grid(const QStringList& lineparts) { if (lineparts.empty()) { fatal(MYNAME ": Missing grid headline!\n"); @@ -1083,8 +1026,8 @@ parse_grid(const QStringList& lineparts) } } -static void -parse_datum(const QStringList& lineparts) +void +GarminTxtFormat::parse_datum(const QStringList& lineparts) { if (lineparts.empty()) { fatal(MYNAME ": Missing GPS datum headline!\n"); @@ -1094,15 +1037,15 @@ parse_datum(const QStringList& lineparts) datum_index = gt_lookup_datum_index(CSTR(str), MYNAME); } -static void -parse_waypoint(const QStringList& lineparts) +void +GarminTxtFormat::parse_waypoint(const QStringList& lineparts) { int column = -1; bind_fields(waypt_header); auto* wpt = new Waypoint; - garmin_fs_t* gmsd = garmin_fs_alloc(-1); + auto* gmsd = new garmin_fs_t(-1); wpt->fs.FsChainAdd(gmsd); for (const auto& str : lineparts) { @@ -1184,6 +1127,7 @@ parse_waypoint(const QStringList& lineparts) break; case 16: if (QDateTime dt = parse_date_and_time(str); dt.isValid()) { + garmin_txt_adjust_time(dt); wpt->SetCreationTime(dt); } break; @@ -1201,8 +1145,8 @@ parse_waypoint(const QStringList& lineparts) waypt_add(wpt); } -static void -parse_route_header(const QStringList& lineparts) +void +GarminTxtFormat::parse_route_header(const QStringList& lineparts) { int column = -1; @@ -1230,8 +1174,8 @@ parse_route_header(const QStringList& lineparts) current_rte = rte; } -static void -parse_track_header(const QStringList& lineparts) +void +GarminTxtFormat::parse_track_header(const QStringList& lineparts) { int column = -1; @@ -1259,8 +1203,8 @@ parse_track_header(const QStringList& lineparts) } -static void -parse_route_waypoint(const QStringList& lineparts) +void +GarminTxtFormat::parse_route_waypoint(const QStringList& lineparts) { int column = -1; Waypoint* wpt = nullptr; @@ -1291,8 +1235,8 @@ parse_route_waypoint(const QStringList& lineparts) } } -static void -parse_track_waypoint(const QStringList& lineparts) +void +GarminTxtFormat::parse_track_waypoint(const QStringList& lineparts) { int column = -1; @@ -1319,6 +1263,7 @@ parse_track_waypoint(const QStringList& lineparts) break; case 2: if (QDateTime dt = parse_date_and_time(str); dt.isValid()) { + garmin_txt_adjust_time(dt); wpt->SetCreationTime(dt); } break; @@ -1352,8 +1297,8 @@ parse_track_waypoint(const QStringList& lineparts) /***************************************************************/ -static void -garmin_txt_rd_init(const QString& fname) +void +GarminTxtFormat::rd_init(const QString& fname) { gtxt_flags = {}; @@ -1367,10 +1312,11 @@ garmin_txt_rd_init(const QString& fname) grid_index = (grid_type) -1; init_date_and_time_format(); + garmin_txt_utc_option(); } -static void -garmin_txt_rd_deinit() +void +GarminTxtFormat::rd_deinit() { free_headers(); header_column_names.clear(); @@ -1381,8 +1327,8 @@ garmin_txt_rd_deinit() date_time_format.squeeze(); } -static void -garmin_txt_read() +void +GarminTxtFormat::read() { QString buff; @@ -1426,27 +1372,4 @@ garmin_txt_read() } } - -/* - * The file encoding is windows-1252. - * Conversion between windows-1252 and utf-16 is handled by the stream. - * Conversion between utf-16 and utf-8 is handled by this format. - * Let main know char strings have already been converted to utf-8 - * so it doesn't attempt to re-convert any char strings including gmsd data. - */ - -ff_vecs_t garmin_txt_vecs = { - ff_type_file, - FF_CAP_RW_ALL, - garmin_txt_rd_init, - garmin_txt_wr_init, - garmin_txt_rd_deinit, - garmin_txt_wr_deinit, - garmin_txt_read, - garmin_txt_write, - nullptr, - &garmin_txt_args, - NULL_POS_OPS -}; - #endif // CSVFMTS_ENABLED diff --git a/garmin_txt.h b/garmin_txt.h new file mode 100644 index 000000000..82346a387 --- /dev/null +++ b/garmin_txt.h @@ -0,0 +1,203 @@ +/* + + Support for MapSource Text Export (Tab delimited) files. + + Copyright (C) 2006 Olaf Klein, o.b.klein@gpsbabel.org + Copyright (C) 2004-2022 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + */ +#ifndef GARMIN_TXT_H_INCLUDED_ +#define GARMIN_TXT_H_INCLUDED_ + +#if CSVFMTS_ENABLED + +#include // for array +#include // for uint16_t +#include // for time_t +#include // for pair + +#include // for QDateTime +#include // for QList +#include // for QString +#include // for QStringList +#include // for QVector + +#include "defs.h" +#include "format.h" // for Format +#include "src/core/textstream.h" // for TextStream + + +class GarminTxtFormat : public Format +{ +public: + QVector* get_args() override + { + return &garmin_txt_args; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + return FF_CAP_RW_ALL; + } + + void rd_init(const QString& fname) override; + void read() override; + void rd_deinit() override; + void wr_init(const QString& fname) override; + void write() override; + void wr_deinit() override; + +private: + /* Constants */ + + static constexpr double kGarminUnknownAlt = 1.0e25; + static constexpr char kDefaultDateFormat[] = "dd/mm/yyyy"; + static constexpr char kDefaultTimeFormat[] = "HH:mm:ss"; + + static const QVector headers; + + /* Types */ + + struct gtxt_flags_t { + unsigned int metric:1; + unsigned int celsius:1; + unsigned int utc:1; + unsigned int enum_waypoints:1; + unsigned int route_header_written:1; + unsigned int track_header_written:1; + }; + + enum header_type { + waypt_header = 0, + rtept_header, + trkpt_header, + route_header, + track_header, + unknown_header + }; + + class PathInfo + { + public: + double length {0}; + time_t start {0}; + time_t time {0}; + double speed {0}; + double total {0}; + int count {0}; + const Waypoint* prev_wpt {nullptr}; + const Waypoint* first_wpt {nullptr}; + const Waypoint* last_wpt {nullptr}; + }; + + /* Member Functions */ + + static bool is_valid_alt(double alt); + static const char* get_option_val(const char* option, const char* def); + void init_date_and_time_format(); + void convert_datum(const Waypoint* wpt, double* dest_lat, double* dest_lon) const; + void enum_waypt_cb(const Waypoint* wpt); + void prework_hdr_cb(const route_head* unused); + void prework_tlr_cb(const route_head* unused); + void prework_wpt_cb(const Waypoint* wpt); + void print_position(const Waypoint* wpt); + void print_date_and_time(time_t time, bool time_only); + void print_categories(uint16_t categories); + void print_course(const Waypoint* A, const Waypoint* B); + void print_distance(double distance, bool no_scale, bool with_tab, int decis); + void print_speed(double distance, time_t time); + void print_temperature(float temperature); + void print_string(const char* fmt, const QString& string); + void write_waypt(const Waypoint* wpt); + void route_disp_hdr_cb(const route_head* rte); + void route_disp_tlr_cb(const route_head* unused); + void route_disp_wpt_cb(const Waypoint* wpt); + void track_disp_hdr_cb(const route_head* track); + void track_disp_tlr_cb(const route_head* unused); + void track_disp_wpt_cb(const Waypoint* wpt); + void garmin_txt_utc_option(); + void garmin_txt_adjust_time(QDateTime& dt) const; + void free_headers(); + static QString strftime_to_timespec(const char* s); + QDateTime parse_date_and_time(const QString& str); + uint16_t parse_categories(const QString& str) const; + bool parse_temperature(const QString& str, double* temperature) const; + void parse_header(const QStringList& lineparts); + bool parse_display(const QString& str, int* val) const; + void bind_fields(header_type ht); + void parse_grid(const QStringList& lineparts); + void parse_datum(const QStringList& lineparts); + void parse_waypoint(const QStringList& lineparts); + void parse_route_header(const QStringList& lineparts); + void parse_track_header(const QStringList& lineparts); + void parse_route_waypoint(const QStringList& lineparts); + void parse_track_waypoint(const QStringList& lineparts); + + /* Data Members */ + + gpsbabel::TextStream* fin = nullptr; + gpsbabel::TextStream* fout = nullptr; + route_head* current_trk{}; + route_head* current_rte{}; + int waypoints{}; + int routepoints{}; + const Waypoint** wpt_a{}; + int wpt_a_ct{}; + grid_type grid_index{}; + int datum_index{}; + const char* datum_str{}; + int current_line{}; + QString date_time_format; + int precision = 3; + time_t utc_offs = 0; + gtxt_flags_t gtxt_flags{}; + + std::array>, unknown_header> header_mapping_info; + QStringList header_column_names; + + char* opt_datum = nullptr; + char* opt_dist = nullptr; + char* opt_temp = nullptr; + char* opt_date_format = nullptr; + char* opt_time_format = nullptr; + char* opt_precision = nullptr; + char* opt_utc = nullptr; + char* opt_grid = nullptr; + + QVector garmin_txt_args = { + {"date", &opt_date_format, "Read/Write date format (i.e. yyyy/mm/dd)", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + {"datum", &opt_datum, "GPS datum (def. WGS 84)", "WGS 84", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + {"dist", &opt_dist, "Distance unit [m=metric, s=statute]", "m", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + {"grid", &opt_grid, "Write position using this grid.", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + {"prec", &opt_precision, "Precision of coordinates", "3", ARGTYPE_INT, ARG_NOMINMAX, nullptr}, + {"temp", &opt_temp, "Temperature unit [c=Celsius, f=Fahrenheit]", "c", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + {"time", &opt_time_format, "Read/Write time format (i.e. HH:mm:ss xx)", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + {"utc", &opt_utc, "Write timestamps with offset x to UTC time", nullptr, ARGTYPE_INT, "-23", "+23", nullptr}, + }; + + PathInfo* route_info{}; + int route_idx{}; + PathInfo* cur_info{}; +}; + +#endif // CSVFMTS_ENABLED +#endif // GARMIN_TXT_H_INCLUDED_ diff --git a/garmin_xt.cc b/garmin_xt.cc index 5e62af4db..6f96b2b13 100644 --- a/garmin_xt.cc +++ b/garmin_xt.cc @@ -23,15 +23,16 @@ */ +#include "garmin_xt.h" + #include // for uint8_t, uint32_t, uint16_t, int32_t #include // for SEEK_CUR, SEEK_SET #include // for strcmp, strcpy #include // for QString -#include // for QVector -#include "defs.h" // -#include "gbfile.h" // for gbfread, gbfgetuint16, gbfseek, gbfgetc, gbfgetu... +#include "defs.h" +#include "gbfile.h" // for gbfread, gbfgetuint16, gbfseek, gbfgetc, gbfgetuint32, gbfclose, gbfeof, gbfopen #define MYNAME "Garmin_XT" @@ -39,38 +40,6 @@ #define DATABLOCKSIZE 1 #define STRK_BLOCK_SIZE 97 -static int colors[] = { - 0x000000, // Black - 0x00008b, // DarkRed - 0x006400, // DarkGreen - 0x00d7ff, // Gold - 0x8b0000, // DarkBlue - 0x8b008b, // DarkMagenta - 0x8b8b00, // DarkCyan - 0xd3d3d3, // LightGray - 0xa9a9a9, // DarkGray - 0x0000ff, // Red - 0x00ff00, // Green - 0x00ffff, // Yellow - 0xff0000, // Blue - 0xff00ff, // Magenta - 0xffff00, // Cyan - 0xffffff // White -}; - -static gbfile* fin; -static route_head* track; -static char* opt_xt_ftype = nullptr; -static char* opt_trk_header = nullptr; - -static -QVector format_garmin_xt_args = { - {"ftype", &opt_xt_ftype, "Garmin Mobile XT ([ATRK]/STRK)", "ATRK", ARGTYPE_STRING | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr}, - // TODO: SHIFT - can't test behaviour, do not have appropriate files - //{"trk_header_opt", &opt_trk_header, "Track name processing option ([0]-nrm/1-ign/2-sht)", "0", ARGTYPE_INT, ARG_NOMINMAX}, - {"trk_header", &opt_trk_header, "Track name processing option ([0]-nrm/1-ign)", "0", ARGTYPE_INT, ARG_NOMINMAX, nullptr}, -}; - /******************************************************************************* * %%% global callbacks called by gpsbabel main process %%% * *******************************************************************************/ @@ -78,24 +47,27 @@ QVector format_garmin_xt_args = { /******************************************************************************* * %%% Reader callbacks %%% * *******************************************************************************/ -static void -format_garmin_xt_rd_init(const QString& fname) +void +GarminXTFormat::rd_init(const QString& fname) { fin = gbfopen(fname, "rb", MYNAME); } -static void -format_garmin_xt_rd_deinit() +void +GarminXTFormat::rd_deinit() { gbfclose(fin); } -static uint16_t -format_garmin_xt_rd_st_attrs(char* p_trk_name, uint8_t* p_track_color) +uint16_t +GarminXTFormat::format_garmin_xt_rd_st_attrs(char* p_trk_name, uint8_t* p_track_color) { int method = 0; uint8_t spam = 0; - int32_t TrackMaxLat = 0, TrackMaxLon = 0, TrackMinLat = 0, TrackMinLon = 0; + int32_t TrackMaxLat = 0; + int32_t TrackMaxLon = 0; + int32_t TrackMinLat = 0; + int32_t TrackMinLon = 0; char trk_name[30]=""; // TODO: SHIFT - can't test behaviour, do not have appropriate files //int ii; @@ -156,8 +128,8 @@ format_garmin_xt_rd_st_attrs(char* p_trk_name, uint8_t* p_track_color) /* * Function to decrypt track block in saved read from saved tracks file */ -static void -format_garmin_xt_decrypt_trk_blk(int Count, uint8_t TrackBlock[]) +void +GarminXTFormat::format_garmin_xt_decrypt_trk_blk(int Count, uint8_t TrackBlock[]) { int j = 12; while (j<(Count-1)) { @@ -174,8 +146,8 @@ format_garmin_xt_decrypt_trk_blk(int Count, uint8_t TrackBlock[]) /* * Function to Decompose track block of STRK_BLOCK_SIZE bytes */ -static void -format_garmin_xt_decomp_trk_blk(uint8_t ii, const uint8_t TrackBlock[], double* Ele, double* Lat, double* Lon, uint32_t* Time) +void +GarminXTFormat::format_garmin_xt_decomp_trk_blk(uint8_t ii, const uint8_t TrackBlock[], double* Ele, double* Lat, double* Lon, uint32_t* Time) { //printf("%d %d %d %d %d %d\n", TrackBlock[0], TrackBlock[1], TrackBlock[2], TrackBlock[3], TrackBlock[4], TrackBlock[5]); uint16_t PrevEleW = TrackBlock[(ii - 1) * 12 + 1 ]; @@ -218,8 +190,8 @@ format_garmin_xt_decomp_trk_blk(uint8_t ii, const uint8_t TrackBlock[], double* /* * Decompose Last Waypoint Elevation */ -static void -format_garmin_xt_decomp_last_ele(uint8_t ii, double* PrevEle, const uint8_t TrackBlock[]) +void +GarminXTFormat::format_garmin_xt_decomp_last_ele(uint8_t ii, double* PrevEle, const uint8_t TrackBlock[]) { uint16_t PrevEleW = TrackBlock[ii - 1]; PrevEleW = PrevEleW << 8; @@ -230,15 +202,19 @@ format_garmin_xt_decomp_last_ele(uint8_t ii, double* PrevEle, const uint8_t Trac /* * Main Function to process Saved tracks file */ -static void -format_garmin_xt_proc_strk() +void +GarminXTFormat::format_garmin_xt_proc_strk() { int Count = 0; // Used to obtain number of read bytes int TracksCompleted = 0; // Number of processed tracks uint8_t TrackBlock[STRK_BLOCK_SIZE]; // File Block - double Lat = 0, Lon = 0; // wpt data - double PrevLat = 0, PrevLon = 0, PrevEle = 0; // wpt data - uint32_t Time = 0, PrevTime = 0; // wpt data + double Lat = 0; + double Lon = 0; // wpt data + double PrevLat = 0; + double PrevLon = 0; + double PrevEle = 0; // wpt data + uint32_t Time = 0; + uint32_t PrevTime = 0; // wpt data uint8_t trk_color = 0xff; // Skip 12 bytes from the BOF @@ -331,8 +307,8 @@ format_garmin_xt_proc_strk() } } -static void -format_garmin_xt_proc_atrk() +void +GarminXTFormat::format_garmin_xt_proc_atrk() { int method = 0; unsigned char buf[3]; @@ -393,8 +369,8 @@ format_garmin_xt_proc_atrk() } } -static void -format_garmin_xt_read() +void +GarminXTFormat::read() { // Saved Tracks file if (strcmp(opt_xt_ftype, "STRK") == 0) { @@ -403,27 +379,3 @@ format_garmin_xt_read() format_garmin_xt_proc_atrk(); } } - -/**************************************************************************/ - -/* ascii is the expected character set */ -/* not fixed, can be changed through command line parameter */ - -ff_vecs_t format_garmin_xt_vecs = { - ff_type_file, - { - ff_cap_none /* waypoints */, - ff_cap_read /* tracks */, - ff_cap_none /* routes */ - }, - format_garmin_xt_rd_init, - nullptr, - format_garmin_xt_rd_deinit, - nullptr, - format_garmin_xt_read, - nullptr, - nullptr, - &format_garmin_xt_args, - NULL_POS_OPS -}; -/**************************************************************************/ diff --git a/garmin_xt.h b/garmin_xt.h new file mode 100644 index 000000000..39c5b44c2 --- /dev/null +++ b/garmin_xt.h @@ -0,0 +1,105 @@ +/* + + Copyright (C) 2010 Eriks Zelenka, isindir@users.sourceforge.net + Copyright (C) 2009 jekaeff, + GMXT2GPX ( http://www.geocaching.hu/users.geo?id=9508 ; http://sites.google.com/site/jekaeff/eng-1 ) + The original code written in Pascal and does not include specific License, however on the project + webpage it is said to be OpenSource/Libre software + Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef GARMIN_XT_H_INCLUDED_ +#define GARMIN_XT_H_INCLUDED_ + +#include // for uint8_t, uint16_t, uint32_t + +#include // for QString +#include // for QVector + +#include "defs.h" +#include "format.h" // for Format +#include "gbfile.h" // for gbfile + + +class GarminXTFormat : public Format +{ +public: + QVector* get_args() override + { + return &format_garmin_xt_args; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + return {ff_cap_none, ff_cap_read, ff_cap_none}; + } + + void rd_init(const QString& fname) override; + void read() override; + void rd_deinit() override; + +private: + /* Constants */ + + static constexpr int colors[] = { + 0x000000, // Black + 0x00008b, // DarkRed + 0x006400, // DarkGreen + 0x00d7ff, // Gold + 0x8b0000, // DarkBlue + 0x8b008b, // DarkMagenta + 0x8b8b00, // DarkCyan + 0xd3d3d3, // LightGray + 0xa9a9a9, // DarkGray + 0x0000ff, // Red + 0x00ff00, // Green + 0x00ffff, // Yellow + 0xff0000, // Blue + 0xff00ff, // Magenta + 0xffff00, // Cyan + 0xffffff // White + }; + + /* Member Functions */ + + uint16_t format_garmin_xt_rd_st_attrs(char* p_trk_name, uint8_t* p_track_color); + static void format_garmin_xt_decrypt_trk_blk(int Count, uint8_t* TrackBlock); + static void format_garmin_xt_decomp_trk_blk(uint8_t ii, const uint8_t* TrackBlock, double* Ele, double* Lat, double* Lon, uint32_t* Time); + static void format_garmin_xt_decomp_last_ele(uint8_t ii, double* PrevEle, const uint8_t* TrackBlock); + void format_garmin_xt_proc_strk(); + void format_garmin_xt_proc_atrk(); + + /* Data Members */ + + gbfile* fin{}; + route_head* track{}; + char* opt_xt_ftype = nullptr; + char* opt_trk_header = nullptr; + + QVector format_garmin_xt_args = { + {"ftype", &opt_xt_ftype, "Garmin Mobile XT ([ATRK]/STRK)", "ATRK", ARGTYPE_STRING | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr}, + // TODO: SHIFT - can't test behaviour, do not have appropriate files + //{"trk_header_opt", &opt_trk_header, "Track name processing option ([0]-nrm/1-ign/2-sht)", "0", ARGTYPE_INT, ARG_NOMINMAX}, + {"trk_header", &opt_trk_header, "Track name processing option ([0]-nrm/1-ign)", "0", ARGTYPE_INT, ARG_NOMINMAX, nullptr}, + }; +}; +#endif // GARMIN_XT_H_INCLUDED_ diff --git a/gbversion.cmake b/gbversion.cmake index 6a7433649..dfad1ac24 100644 --- a/gbversion.cmake +++ b/gbversion.cmake @@ -14,14 +14,14 @@ # By defining the version here we minimize the number of locations # containing the definition to gbversion.pri and gbversion.cmake. -set(GB.VERSION 1.8.0) # also change in gbversion.pri +set(GB.VERSION 1.9.0) string(REPLACE "." ";" VERSION_COMPONENTS ${GB.VERSION}) list(GET VERSION_COMPONENTS 0 GB.MAJOR) list(GET VERSION_COMPONENTS 1 GB.MINOR) list(GET VERSION_COMPONENTS 2 GB.MICRO) # Increase GB.BUILD for a new release (why? Where is this ever used?) # A: it's used by win32/gpsbabel.rc which includes gbversion.h -set(GB.BUILD 32 CACHE STRING "Fourth component of Windows VERSIONINFO resource FILEVERSION and PRODUCTVERSION parameters.") +set(GB.BUILD 33 CACHE STRING "Fourth component of Windows VERSIONINFO resource FILEVERSION and PRODUCTVERSION parameters.") set(GB.PACKAGE_RELEASE "" CACHE STRING "String to append to VERSION tuple.") # .e.g. "-beta20190413" set(GB.SHA $ENV{GITHUB_SHA}) if(DEFINED ENV{GITHUB_SHA}) @@ -35,4 +35,4 @@ endif() string(TIMESTAMP GB.COPYRIGHT_YEAR "%Y" UTC) # may be overridden on cmake command line -set(DOCVERSION ${GB.VERSION} CACHE STRING "String appended to documentation location for www.gpsbabel.org.") +set(GPSBABEL_DOCVERSION ${GB.VERSION} CACHE STRING "String appended to documentation location for www.gpsbabel.org.") diff --git a/gbversion.h.in b/gbversion.h.in index 5334e826c..cb3419d67 100644 --- a/gbversion.h.in +++ b/gbversion.h.in @@ -16,5 +16,5 @@ #define VERSION "@GB.MAJOR@.@GB.MINOR@.@GB.MICRO@@GB.PACKAGE_RELEASE@" constexpr char kVersionSHA[] = "@GB.SHA@"; constexpr char kVersionDate[] = "@GB.DATE@"; -#define WEB_DOC_DIR "https://www.gpsbabel.org/htmldoc-@DOCVERSION@" +#define WEB_DOC_DIR "https://www.gpsbabel.org/htmldoc-@GPSBABEL_DOCVERSION@" #endif diff --git a/gdb.cc b/gdb.cc index 347af342f..5a2d4e2ad 100644 --- a/gdb.cc +++ b/gdb.cc @@ -40,13 +40,14 @@ #include // for memset, strstr, strcmp #include // for next -#include "defs.h" // for Waypoint, warning, route_head, fatal, UrlLink, bounds, mkshort, UrlList, unknown_alt, xfree, waypt_add_to_bounds, waypt_init_bounds, xstrtoi, mkshort_del_handle, route_add_wpt, route_disp_all, waypt_bounds_valid, xmalloc, gb_color, WaypointList, find_wa... +#include "defs.h" // for Waypoint, warning, route_head, fatal, UrlLink, bounds, UrlList, unknown_alt, xfree, waypt_add_to_bounds, waypt_init_bounds, xstrtoi, route_add_wpt, route_disp_all, waypt_bounds_valid, xmalloc, gb_color, WaypointList, find_wa... #include "formspec.h" // for FormatSpecificDataList -#include "garmin_fs.h" // for garmin_fs_t, garmin_ilink_t, garmin_fs_alloc +#include "garmin_fs.h" // for garmin_fs_t, garmin_ilink_t #include "garmin_tables.h" // for gt_waypt_class_map_point, gt_color_index_by_rgb, gt_color_value, gt_waypt_classes_e, gt_find_desc_from_icon_number, gt_find_icon_number_from_desc, gt_gdb_display_mode_symbol, gt_get_icao_country, gt_waypt_class_user_waypoint, GDB, gt_display_mode_symbol #include "gbfile.h" // for gbfgetint32, gbfputint32, gbfgetc, gbfread, gbfwrite, gbfgetdbl, gbfputc, gbfgetcstr, gbfclose, gbfgetnativecstr, gbfopen_le, gbfputint16, gbfile, gbfcopyfrom, gbfputcstr, gbfrewind, gbfseek, gbftell, gbfgetcstr_old, gbfgetint16, gbfgetuint32, gbfputdbl #include "grtcirc.h" // for RAD, gcdist, radtometers #include "jeeps/gpsmath.h" // for GPS_Math_Deg_To_Semi, GPS_Math_Semi_To_Deg +#include "mkshort.h" // for MakeShort #include "src/core/datetime.h" // for DateTime @@ -257,9 +258,7 @@ GdbFormat::gdb_add_route_waypt(route_head* rte, Waypoint* ref, const int wpt_cla /* At this point we have found a waypoint with same name, but probably from another data stream. Check coordinates! */ - double dist = radtometers(gcdist( - RAD(ref->latitude), RAD(ref->longitude), - RAD(tmp->latitude), RAD(tmp->longitude))); + double dist = radtometers(gcdist(ref->position(), tmp->position())); if (fabs(dist) > 100) { fatal(MYNAME ": Route point mismatch!\n" \ @@ -439,7 +438,7 @@ GdbFormat::read_waypoint(gt_waypt_classes_e* waypt_class_out) waypt_ct++; res = new Waypoint; - gmsd = garmin_fs_alloc(-1); + gmsd = new garmin_fs_t(-1); res->fs.FsChainAdd(gmsd); res->shortname = fread_cstr(); wpt_class = (gt_waypt_classes_e) FREAD_i32; @@ -737,46 +736,37 @@ GdbFormat::read_route() } int links = FREAD_i32; - garmin_ilink_t* il_anchor = nullptr; - garmin_ilink_t* il_root = nullptr; + QList il_list; #if GDB_DEBUG DBG(GDB_DBG_RTE, links) printf(MYNAME "-rte_pt \"%s\" (%d): %d interlink step(s)\n", qPrintable(wpt->shortname), wpt_class, links); #endif for (int j = 0; j < links; j++) { - auto* il_step = (garmin_ilink_t*) xmalloc(sizeof(garmin_ilink_t)); + garmin_ilink_t il_step; - il_step->ref_count = 1; - - il_step->lat = FREAD_LATLON; - il_step->lon = FREAD_LATLON; + il_step.lat = FREAD_LATLON; + il_step.lon = FREAD_LATLON; if (FREAD_C == 1) { - il_step->alt = FREAD_DBL; + il_step.alt = FREAD_DBL; } else { - il_step->alt = unknown_alt; + il_step.alt = unknown_alt; } if (j == 0) { - wpt->latitude = il_step->lat; - wpt->longitude = il_step->lon; - wpt->altitude = il_step->alt; + wpt->latitude = il_step.lat; + wpt->longitude = il_step.lon; + wpt->altitude = il_step.alt; } - il_step->next = nullptr; - if (il_anchor == nullptr) { - il_root = il_step; - } else { - il_anchor->next = il_step; - } - il_anchor = il_step; + il_list.append(il_step); #if GDB_DEBUG DBG(GDB_DBG_RTEe, true) { printf(MYNAME "-rte_il \"%s\" (%d of %d): %c%0.6f %c%0.6f\n", qPrintable(wpt->shortname), j + 1, links, - il_step->lat < 0 ? 'S' : 'N', il_step->lat, - il_step->lon < 0 ? 'W' : 'E', il_step->lon); + il_step.lat < 0 ? 'S' : 'N', il_step.lat, + il_step.lon < 0 ? 'W' : 'E', il_step.lon); } #endif } @@ -831,19 +821,13 @@ GdbFormat::read_route() if (wpt != nullptr) { garmin_fs_t* gmsd = garmin_fs_t::find(wpt); if (gmsd == nullptr) { - gmsd = garmin_fs_alloc(-1); + gmsd = new garmin_fs_t(-1); wpt->fs.FsChainAdd(gmsd); } garmin_fs_t::set_wpt_class(gmsd, wpt_class); - gmsd->ilinks = il_root; - il_root = nullptr; + gmsd->ilinks = il_list; } - while (il_root) { - garmin_ilink_t* il = il_root; - il_root = il_root->next; - xfree(il); - } } /* ENDFOR: for (i = 0; i < points; i++) */ /* VERSION DEPENDENT CODE */ @@ -1006,7 +990,8 @@ GdbFormat::read() char typ; gt_waypt_classes_e wpt_class; Waypoint* wpt; - route_head* trk, *rte; + route_head* trk; + route_head* rte; int len = FREAD_i32; if (FREAD(&typ, 1) < 1) { @@ -1113,19 +1098,17 @@ GdbFormat::read() void GdbFormat::reset_short_handle(const char* defname) { - if (short_h != nullptr) { - mkshort_del_handle(&short_h); - } + delete short_h; - short_h = mkshort_new_handle(); + short_h = new MakeShort; - setshort_length(short_h, kGDBNameBufferLen); - setshort_badchars(short_h, "\r\n\t"); - setshort_mustupper(short_h, 0); - setshort_mustuniq(short_h, 1); - setshort_whitespace_ok(short_h, 1); - setshort_repeating_whitespace_ok(short_h, 1); - setshort_defname(short_h, defname); + short_h->set_length(kGDBNameBufferLen); + short_h->set_badchars("\r\n\t"); + short_h->set_mustupper(false); + short_h->set_mustuniq(true); + short_h->set_whitespace_ok(true); + short_h->set_repeating_whitespace_ok(true); + short_h->set_defname(defname); } /* ----------------------------------------------------------------------------*/ @@ -1150,8 +1133,8 @@ GdbFormat::write_header() */ static const QDateTime gdb_release_dt = QDateTime(QDate(2011, 4, 14), QTime(1, 30, 1), Qt::UTC); gdb_write_cstr(QStringLiteral("GPSBabel-%1").arg(gpsbabel_version)); - gdb_write_cstr(gdb_release_dt.toString("MMM dd yyyy")); - gdb_write_cstr(gdb_release_dt.toString("HH:mm:ss")); + gdb_write_cstr(gdb_release_dt.toString(u"MMM dd yyyy")); + gdb_write_cstr(gdb_release_dt.toString(u"HH:mm:ss")); finalize_item(fsave, 'A'); @@ -1169,36 +1152,18 @@ GdbFormat::write_header() void GdbFormat::gdb_check_waypt(Waypoint* wpt) { - double lat_orig = wpt->latitude; - double lon_orig = wpt->longitude; - - if (wpt->latitude < -90) { - wpt->latitude += 180; - } else if (wpt->latitude > +90) { - wpt->latitude -= 180; - } - if (wpt->longitude < -180) { - wpt->longitude += 360; - } else if (wpt->longitude > +180) { - wpt->longitude -= 360; - } - - if ((wpt->latitude < -90) || (wpt->latitude > 90.0)) - fatal("Invalid latitude %f in waypoint %s.\n", - lat_orig, !wpt->shortname.isEmpty() ? qPrintable(wpt->shortname) : ""); - if ((wpt->longitude < -180) || (wpt->longitude > 180.0)) - fatal("Invalid longitude %f in waypoint %s.\n", - lon_orig, !wpt->shortname.isEmpty() ? qPrintable(wpt->shortname) : ""); + wpt->NormalizePosition(); } /*-----------------------------------------------------------------------------*/ void GdbFormat::write_waypoint( - const Waypoint* wpt, const QString& shortname, garmin_fs_t* gmsd, + const Waypoint* wpt, const QString& shortname, const garmin_fs_t* gmsd, const int icon, const int display) { - char zbuf[32], ffbuf[32]; + char zbuf[32]; + char ffbuf[32]; waypt_ct++; /* increase informational number of written waypoints */ @@ -1251,7 +1216,7 @@ GdbFormat::write_waypoint( FWRITE(zbuf, 4); QString ld; if (wpt->HasUrlLink()) { - UrlLink l = wpt->GetUrlLink(); + const UrlLink& l = wpt->GetUrlLink(); ld = l.url_; } QString descr = (wpt_class < gt_waypt_class_map_point) ? @@ -1351,7 +1316,8 @@ void GdbFormat::write_route(const route_head* rte, const QString& rte_name) { bounds bounds; - char zbuf[32], ffbuf[32]; + char zbuf[32]; + char ffbuf[32]; memset(zbuf, 0, sizeof(zbuf)); memset(ffbuf, 0xFF, sizeof(ffbuf)); @@ -1392,7 +1358,7 @@ GdbFormat::write_route(const route_head* rte, const QString& rte_name) fatal(MYNAME ": Sorry, that should never happen!!!\n"); } - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); /* extra_data may contain a modified shortname */ gdb_write_cstr((wpt->extra_data) ? *static_cast(wpt->extra_data) : wpt->shortname); @@ -1541,7 +1507,7 @@ GdbFormat::write_waypoint_cb(const Waypoint* refpt) Waypoint* test = gdb_find_wayptq(waypt_nameposn_out_hash, refpt); if (refpt->HasUrlLink() && test && test->HasUrlLink() && route_flag == 0) { - UrlLink orig_link = refpt->GetUrlLink(); + const UrlLink& orig_link = refpt->GetUrlLink(); UrlLink test_link = test->GetUrlLink(); if (orig_link.url_ != test_link.url_) { test = nullptr; @@ -1565,7 +1531,7 @@ GdbFormat::write_waypoint_cb(const Waypoint* refpt) fout = ftmp; /* prepare the waypoint */ - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); int wpt_class = garmin_fs_t::get_wpt_class(gmsd, -1); if (wpt_class == -1) { @@ -1613,7 +1579,7 @@ GdbFormat::write_waypoint_cb(const Waypoint* refpt) } } - name = mkshort(short_h, name); + name = short_h->mkshort(name); wpt->extra_data = new QString(name); write_waypoint(wpt, name, gmsd, icon, display); @@ -1630,9 +1596,9 @@ GdbFormat::write_route_cb(const route_head* rte) QString name; if (rte->rte_name.isNull()) { - name = mkshort(short_h, QString::asprintf("Route%04d", rte->rte_num)); + name = short_h->mkshort(QString::asprintf("Route%04d", rte->rte_num)); } else { - name = mkshort(short_h, rte->rte_name); + name = short_h->mkshort(rte->rte_name); } rte_ct++; /* increase informational number of written routes */ @@ -1652,9 +1618,9 @@ GdbFormat::write_track_cb(const route_head* trk) QString name; if (trk->rte_name.isNull()) { - name = mkshort(short_h, QString::asprintf("Track%04d", trk->rte_num)); + name = short_h->mkshort(QString::asprintf("Track%04d", trk->rte_num)); } else { - name = mkshort(short_h, trk->rte_name); + name = short_h->mkshort(trk->rte_name); } trk_ct++; /* increase informational number of written tracks */ @@ -1704,7 +1670,8 @@ GdbFormat::wr_deinit() { disp_summary(fout); gdb_flush_waypt_queue(waypt_nameposn_out_hash); - mkshort_del_handle(&short_h); + delete short_h; + short_h = nullptr; gbfclose(fout); gbfclose(ftmp); } diff --git a/gdb.h b/gdb.h index b418a51a1..d4797a45e 100644 --- a/gdb.h +++ b/gdb.h @@ -30,13 +30,13 @@ #include // for QString #include // for QStringView #include // for QVector -#include // for QT_VERSION, QT_VERSION_CHECK -#include "defs.h" // for arglist_t, Waypoint, route_head, ARGTYPE_BOOL, ARGTYPE_INT, ARG_NOMINMAX, bounds, FF_CAP_RW_ALL, ff_cap, ff_type, ff_type_file, short_handle +#include "defs.h" // for arglist_t, Waypoint, route_head, ARGTYPE_BOOL, ARGTYPE_INT, ARG_NOMINMAX, bounds, FF_CAP_RW_ALL, ff_cap, ff_type, ff_type_file #include "format.h" // for Format #include "garmin_fs.h" // for garmin_fs_t #include "garmin_tables.h" // for gt_waypt_classes_e #include "gbfile.h" // for gbfile +#include "mkshort.h" // for MakeShort class GdbFormat : public Format @@ -73,23 +73,9 @@ class GdbFormat : public Format public: WptNamePosnKey(const QString& name, double lt, double ln) : shortname(name), lat(lt), lon(ln) {} - friend qhash_result_t qHash(const WptNamePosnKey &c, qhash_result_t seed = 0) noexcept + friend size_t qHash(const WptNamePosnKey &c, size_t seed = 0) noexcept { -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) return qHashMulti(seed, c.shortname.toUpper(), c.lat, c.lon); -#else - /* - * As noted in above refeference - * QtPrivate::QHashCombine is private API, but does not require any special buildsystem magic; - * it’s in , a public header. - */ - QtPrivate::QHashCombine hash; - - seed = hash(seed, c.shortname.toUpper()); - seed = hash(seed, c.lat); - seed = hash(seed, c.lon); - return seed; -#endif } QString shortname; @@ -103,7 +89,7 @@ class GdbFormat : public Format public: WptNameKey(const QString& name) : shortname(name) {} /* converting constructor */ - friend qhash_result_t qHash(const WptNameKey &c, qhash_result_t seed = 0) noexcept + friend size_t qHash(const WptNameKey &c, size_t seed = 0) noexcept { return qHash(c.shortname.toUpper(), seed); } @@ -149,7 +135,7 @@ class GdbFormat : public Format void reset_short_handle(const char* defname); void write_header(); static void gdb_check_waypt(Waypoint* wpt); - void write_waypoint(const Waypoint* wpt, const QString& shortname, garmin_fs_t* gmsd, int icon, int display); + void write_waypoint(const Waypoint* wpt, const QString& shortname, const garmin_fs_t* gmsd, int icon, int display); static void route_compute_bounds(const route_head* rte, bounds* bounds); void route_write_bounds(bounds* bounds) const; void write_route(const route_head* rte, const QString& rte_name); @@ -172,7 +158,7 @@ class GdbFormat : public Format WptNamePosnHash waypt_nameposn_in_hidden_hash; WptNameHash waypt_name_in_hidden_hash; WptNamePosnHash waypt_nameposn_out_hash; - short_handle short_h{}; + MakeShort* short_h{}; char* gdb_opt_category{}; char* gdb_opt_ver{}; diff --git a/geo.cc b/geo.cc index 808a96121..15eab8623 100644 --- a/geo.cc +++ b/geo.cc @@ -33,7 +33,7 @@ #define MYNAME "geo" -void GeoFormat::GeoReadLoc(QXmlStreamReader& reader) const +void GeoFormat::GeoReadLoc(QXmlStreamReader& reader) { Waypoint* wpt = nullptr; QString current_tag; @@ -154,7 +154,7 @@ void GeoFormat::geo_waypt_pr(const Waypoint* waypointp, QXmlStreamWriter& writer if (waypointp->HasUrlLink()) { writer.writeStartElement(QStringLiteral("link")); writer.writeAttribute(QStringLiteral("text "), QStringLiteral("Cache Details")); - UrlLink link = waypointp->GetUrlLink(); + const UrlLink& link = waypointp->GetUrlLink(); writer.writeCharacters(link.url_); writer.writeEndElement(); } diff --git a/geo.h b/geo.h index 884b47cdd..96b31f492 100644 --- a/geo.h +++ b/geo.h @@ -60,9 +60,9 @@ class GeoFormat : public Format /* Member Functions */ - void GeoReadLoc(QXmlStreamReader& reader) const; - void geo_waypt_pr(const Waypoint*, QXmlStreamWriter& writer); - static Geocache::container_t wpt_container(const QString&); + static void GeoReadLoc(QXmlStreamReader& reader); + void geo_waypt_pr(const Waypoint* waypointp, QXmlStreamWriter& writer); + static Geocache::container_t wpt_container(const QString& args); /* Data Members */ diff --git a/geocache.h b/geocache.h index 25c491319..a2d73d294 100644 --- a/geocache.h +++ b/geocache.h @@ -79,22 +79,6 @@ class Geocache QString utf_string; }; - /* Special Member Functions */ - - Geocache() : - id(0), - type(type_t::gt_unknown), - container(container_t::gc_unknown), - diff(0), - terr(0), - is_archived(status_t::gs_unknown), - is_available(status_t::gs_unknown), - is_memberonly(status_t::gs_unknown), - has_customcoords(status_t::gs_unknown), - placer_id(0), - favorite_points(0) - {} - /* Member Functions */ void set_type(const QString& type_name); @@ -105,23 +89,22 @@ class Geocache /* Data Members */ - long long id; /* The decimal cache number */ - type_t type:5; - container_t container:4; - unsigned int diff:6; /* (multiplied by ten internally) */ - unsigned int terr:6; /* (likewise) */ - status_t is_archived:2; - status_t is_available:2; - status_t is_memberonly:2; - status_t has_customcoords:2; - gpsbabel::DateTime exported; + long long id{0}; /* The decimal cache number */ + type_t type:5{type_t::gt_unknown}; + container_t container:4{container_t::gc_unknown}; + unsigned int diff:6{0}; /* (multiplied by ten internally) */ + unsigned int terr:6{0}; /* (likewise) */ + status_t is_archived:2{status_t::gs_unknown}; + status_t is_available:2{status_t::gs_unknown}; + status_t is_memberonly:2{status_t::gs_unknown}; + status_t has_customcoords:2{status_t::gs_unknown}; gpsbabel::DateTime last_found; QString placer; /* Placer name */ - int placer_id; /* Placer id */ + int placer_id{0}; /* Placer id */ QString hint; /* all these UTF8, XML entities removed, May be not HTML. */ UtfString desc_short; UtfString desc_long; - int favorite_points; + int favorite_points{0}; QString personal_note; private: diff --git a/geojson.cc b/geojson.cc index 1c914dcdf..c6dc6eb0a 100644 --- a/geojson.cc +++ b/geojson.cc @@ -73,7 +73,7 @@ GeoJsonFormat::geojson_waypt_pr(const Waypoint* waypoint) const properties[DESCRIPTION] = waypoint->description; } if (waypoint->HasUrlLink()) { - UrlLink link = waypoint->GetUrlLink(); + const UrlLink& link = waypoint->GetUrlLink(); if (!link.url_.isEmpty()) { properties[URL] = link.url_; } @@ -249,7 +249,7 @@ void GeoJsonFormat::geojson_track_disp(const Waypoint* trackpoint) const if (trackpoint->altitude != unknown_alt && trackpoint->altitude != 0) { coords.append(trackpoint->altitude); } - (*track_coords).append(coords); + track_coords->append(coords); } void GeoJsonFormat::geojson_track_tlr(const route_head* /*unused*/) diff --git a/googletakeout.cc b/googletakeout.cc index a962aa49c..5ba243c83 100644 --- a/googletakeout.cc +++ b/googletakeout.cc @@ -40,24 +40,17 @@ #include "src/core/file.h" // for File #include "src/core/logging.h" // for Debug, FatalMsg, Warning -#define MYNAME "Google Takeout" -#define TIMELINE_OBJECTS "timelineObjects" -static const QList takeout_month_names{ - "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", - "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" -}; - -static inline void takeout_fatal(const QString& message) { +void GoogleTakeoutFormat::takeout_fatal(const QString& message) { fatal(FatalMsg() << MYNAME << ": " << message); } -static inline void takeout_warning(const QString& message) { +void GoogleTakeoutFormat::takeout_warning(const QString& message) { Warning() << MYNAME << ": " << message; } /* create a waypoint from late7/lone7 and optional metadata */ -static Waypoint* takeout_waypoint( +Waypoint* GoogleTakeoutFormat::takeout_waypoint( int lat_e7, int lon_e7, const QString* shortname, @@ -65,23 +58,23 @@ static Waypoint* takeout_waypoint( const QString* start_str ) { - Waypoint* waypoint = new Waypoint(); + auto* waypoint = new Waypoint(); waypoint->latitude = lat_e7 / 1e7; waypoint->longitude = lon_e7 / 1e7; - if (shortname && (*shortname).length() > 0) { + if (shortname && shortname->length() > 0) { waypoint->shortname = *shortname; } - if (description && (*description).length() > 0) { + if (description && description->length() > 0) { waypoint->description = *description; } - if (start_str && (*start_str).length() > 0) { + if (start_str && start_str->length() > 0) { gpsbabel::DateTime start = QDateTime::fromString(*start_str, Qt::ISODate); waypoint->SetCreationTime(start); } return waypoint; } -static bool track_maybe_add_wpt(route_head* route, Waypoint* waypoint) { +bool GoogleTakeoutFormat::track_maybe_add_wpt(route_head* route, Waypoint* waypoint) { if (waypoint->latitude == 0 && waypoint->longitude == 0) { if (global_opts.debug_level >= 2) { Debug(2) << "Track " << route->rte_name << "@" << @@ -95,7 +88,7 @@ static bool track_maybe_add_wpt(route_head* route, Waypoint* waypoint) { return true; } -static QList readJson( +QList GoogleTakeoutFormat::GoogleTakeoutInputStream::readJson( const QString& source) { if (global_opts.debug_level >= 2) { @@ -142,7 +135,7 @@ static QList readJson( return timeline; } -static QList readDir( +QList GoogleTakeoutFormat::GoogleTakeoutInputStream::readDir( const QString& source) { if (global_opts.debug_level >= 2) { @@ -158,6 +151,10 @@ static QList readDir( * folders */ if (baseName.length() == 4 && baseName.toInt() > 0) { + static const QList takeout_month_names{ + "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", + "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" + }; for (auto&& month : takeout_month_names) { const QString path = source + "/" + baseName + "_" + month + ".json"; const QFileInfo info{path}; @@ -337,7 +334,6 @@ GoogleTakeoutFormat::add_activity_segment(const QJsonObject& activitySegment) * TODO: do something with simplifiedRawPath */ int n_points = 0; - Waypoint* waypoint = nullptr; auto* route = new route_head; const QJsonObject startLoc = activitySegment[START_LOCATION].toObject(); const QJsonObject endLoc = activitySegment[END_LOCATION].toObject(); @@ -347,7 +343,7 @@ GoogleTakeoutFormat::add_activity_segment(const QJsonObject& activitySegment) track_add_head(route); QString timestamp; timestamp = activitySegment[DURATION][START_TIMESTAMP].toString(); - waypoint = takeout_waypoint( + Waypoint* waypoint = takeout_waypoint( startLoc[LOCATION_LATE7].toInt(), startLoc[LOCATION_LONE7].toInt(), nullptr, nullptr, @@ -404,7 +400,7 @@ GoogleTakeoutFormat::add_activity_segment(const QJsonObject& activitySegment) return n_points; } -void GoogleTakeoutInputStream::loadSource(const QString& source) { +void GoogleTakeoutFormat::GoogleTakeoutInputStream::loadSource(const QString& source) { const QFileInfo info{source}; if (info.isDir()) { sources += readDir(source); @@ -415,7 +411,7 @@ void GoogleTakeoutInputStream::loadSource(const QString& source) { } } -QJsonValue GoogleTakeoutInputStream::next() { +QJsonValue GoogleTakeoutFormat::GoogleTakeoutInputStream::next() { if (!timelineObjects.isEmpty()) { QJsonValue nextObject = timelineObjects.first(); timelineObjects.removeFirst(); diff --git a/googletakeout.h b/googletakeout.h index ea549f6f5..3d805562a 100644 --- a/googletakeout.h +++ b/googletakeout.h @@ -19,14 +19,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef _GOOGLETAKEOUT_H -#define _GOOGLETAKEOUT_H +#ifndef GOOGLETAKEOUT_H_INCLUDED_ +#define GOOGLETAKEOUT_H_INCLUDED_ #include // for QJsonObject #include // for QJsonValue #include // for QList #include // for QString -#include // for qMakeStringPrivate, QStringLiteral #include // for QVector #include "defs.h" @@ -38,29 +37,6 @@ * * TODO: Allow date ranges */ -class GoogleTakeoutInputStream -{ -public: - /* Special Member Functions */ - GoogleTakeoutInputStream() = default; - GoogleTakeoutInputStream(const QString& source) : sources({source}) {}; - - /* Member Functions */ - - // Returns the next timelineObject, or a null QJsonValue if we're at the end - QJsonValue next(); - -private: - /* Member Functions */ - - void loadSource(const QString& source); - - /* Data Members */ - - QList sources; - QList timelineObjects; -}; - /* Read-only Google Timeline Location History gpsbabel Format */ class GoogleTakeoutFormat : public Format { @@ -75,7 +51,7 @@ class GoogleTakeoutFormat : public Format ff_type get_type() const override { - return ff_type_file; + return ff_type_file; } QVector get_cap() const override @@ -86,43 +62,76 @@ class GoogleTakeoutFormat : public Format void rd_init(const QString& fname) override {} void read() override; - + private: /* Constants */ - const QString PLACE_VISIT = QStringLiteral("placeVisit"); - const QString ACTIVITY_SEGMENT = QStringLiteral("activitySegment"); - const QString ACTIVITY_TYPE = QStringLiteral("activityType"); - const QString LOCATION = QStringLiteral("location"); - const QString LOCATION_LATE7 = QStringLiteral("latitudeE7"); - const QString LOCATION_LONE7 = QStringLiteral("longitudeE7"); - const QString NAME = QStringLiteral("name"); - const QString ADDRESS = QStringLiteral("address"); - const QString DURATION = QStringLiteral("duration"); - const QString START_TIMESTAMP = QStringLiteral("startTimestamp"); - const QString START_LOCATION = QStringLiteral("startLocation"); - const QString END_TIMESTAMP = QStringLiteral("endTimestamp"); - const QString END_LOCATION = QStringLiteral("endLocation"); - const QString TIMESTAMP = QStringLiteral("timestamp"); - const QString SIMPLE_PATH = QStringLiteral("simplifiedRawPath"); - const QString POINTS = QStringLiteral("points"); - const QString WAYPOINT_PATH = QStringLiteral("waypointPath"); - const QString WAYPOINTS = QStringLiteral("waypoints"); - // for some reason that probably only a former Google engineer knows,); - // we use = QStringLiteral("latE7"/"lngE7" here instead of "latitudeE7"/"longitudeE7".); - // +10 points for brevity, but -100 points for inconsistency.); - const QString LATE7 = QStringLiteral("latE7"); - const QString LONE7 = QStringLiteral("lngE7"); + static constexpr char MYNAME[] = "Google Takeout"; + static constexpr char TIMELINE_OBJECTS[] = "timelineObjects"; + static constexpr char16_t PLACE_VISIT[] = u"placeVisit"; + static constexpr char16_t ACTIVITY_SEGMENT[] = u"activitySegment"; + static constexpr char16_t ACTIVITY_TYPE[] = u"activityType"; + static constexpr char16_t LOCATION[] = u"location"; + static constexpr char16_t LOCATION_LATE7[] = u"latitudeE7"; + static constexpr char16_t LOCATION_LONE7[] = u"longitudeE7"; + static constexpr char16_t NAME[] = u"name"; + static constexpr char16_t ADDRESS[] = u"address"; + static constexpr char16_t DURATION[] = u"duration"; + static constexpr char16_t START_TIMESTAMP[] = u"startTimestamp"; + static constexpr char16_t START_LOCATION[] = u"startLocation"; + static constexpr char16_t END_TIMESTAMP[] = u"endTimestamp"; + static constexpr char16_t END_LOCATION[] = u"endLocation"; + static constexpr char16_t TIMESTAMP[] = u"timestamp"; + static constexpr char16_t SIMPLE_PATH[] = u"simplifiedRawPath"; + static constexpr char16_t POINTS[] = u"points"; + static constexpr char16_t WAYPOINT_PATH[] = u"waypointPath"; + static constexpr char16_t WAYPOINTS [] = u"waypoints"; + // for some reason that probably only a former Google engineer knows,; + // we use[] = u"latE7"/"lngE7" here instead of "latitudeE7"/"longitudeE7".; + // +10 points for brevity, but -100 points for inconsistency.; + static constexpr char16_t LATE7[] = u"latE7"; + static constexpr char16_t LONE7[] = u"lngE7"; + + /* Types */ + + class GoogleTakeoutInputStream + { + public: + /* Special Member Functions */ + GoogleTakeoutInputStream() = default; + GoogleTakeoutInputStream(const QString& source) : sources({source}) {} + + /* Member Functions */ + + // Returns the next timelineObject, or a null QJsonValue if we're at the end + QJsonValue next(); + + private: + /* Member Functions */ + + static QList readJson(const QString& source); + static QList readDir(const QString& source); + void loadSource(const QString& source); + + /* Data Members */ + + QList sources; + QList timelineObjects; + }; /* Member Functions */ + static void takeout_fatal(const QString& message); + static void takeout_warning(const QString& message); + static Waypoint* takeout_waypoint(int lat_e7, int lon_e7, const QString* shortname, const QString* description, const QString* start_str); + static bool track_maybe_add_wpt(route_head* route, Waypoint* waypoint); + static void title_case(QString& title); void add_place_visit(const QJsonObject& placeVisit); int add_activity_segment(const QJsonObject& activitySegment); - static void title_case(QString& title); /* Data Members */ QVector googletakeout_args; }; -#endif /* _GOOGLETAKEOUT_H */ +#endif /* GOOGLETAKEOUT_H_INCLUDED_ */ diff --git a/gpsbabel.qrc b/gpsbabel.qrc index fa17fff4f..6e0a4fc9d 100644 --- a/gpsbabel.qrc +++ b/gpsbabel.qrc @@ -2,6 +2,7 @@ style/arc.style style/csv.style + style/cup.style style/custom.style style/garmin301.style style/garmin_g1000.style diff --git a/gpx.cc b/gpx.cc index 4e591b33e..96af32faa 100644 --- a/gpx.cc +++ b/gpx.cc @@ -21,9 +21,13 @@ #include "gpx.h" +#include // for assert #include // for lround #include // for sscanf +#include // for uint16_t #include // for strchr, strncpy +#include // for optional +#include // for as_const #include // for QByteArray #include // for QDate @@ -43,12 +47,12 @@ #include // for QXmlStreamNamespaceDeclarations #include // for QXmlStreamReader, QXmlStreamReader::Characters, QXmlStreamReader::EndDocument, QXmlStreamReader::EndElement, QXmlStreamReader::Invalid, QXmlStreamReader::StartElement #include // for CaseInsensitive, UTC -#include // for qAsConst, QAddConst<>::Type #include "defs.h" -#include "garmin_fs.h" // for garmin_fs_xml_convert, garmin_fs_xml_fprint, GMSD_FIND +#include "garmin_fs.h" // for garmin_fs_t, garmin_ilink_t #include "garmin_tables.h" // for gt_color_index_by_rgb, gt_color_name, gt_color_value_by_name #include "geocache.h" // for Geocache, Geocache::UtfSt... +#include "mkshort.h" // for MakeShort #include "src/core/datetime.h" // for DateTime #include "src/core/file.h" // for File #include "src/core/logging.h" // for Warning, Fatal @@ -90,17 +94,15 @@ inline QString GpxFormat::toString(float f) void GpxFormat::gpx_reset_short_handle() { - if (mkshort_handle != nullptr) { - mkshort_del_handle(&mkshort_handle); - } + delete mkshort_handle; - mkshort_handle = mkshort_new_handle(); + mkshort_handle = new MakeShort; if (suppresswhite) { - setshort_whitespace_ok(mkshort_handle, 0); + mkshort_handle->set_whitespace_ok(false); } - setshort_length(mkshort_handle, xstrtoi(snlen, nullptr, 10)); + mkshort_handle->set_length(xstrtoi(snlen, nullptr, 10)); } void @@ -213,6 +215,72 @@ GpxFormat::tag_gs_cache(const QXmlStreamAttributes& attr) const } } +void +GpxFormat::tag_garmin_fs(tag_type tag, const QString& text, Waypoint* waypt) +{ + garmin_fs_t* gmsd = garmin_fs_t::find(waypt); + if (gmsd == nullptr) { + gmsd = new garmin_fs_t(-1); + waypt->fs.FsChainAdd(gmsd); + } + + switch (tag) { + case tag_type::garmin_wpt_proximity: + waypt->set_proximity(text.toDouble()); + break; + case tag_type::garmin_wpt_temperature: + waypt->set_temperature(text.toFloat()); + break; + case tag_type::garmin_wpt_depth: + waypt->set_depth(text.toDouble()); + break; + case tag_type::garmin_wpt_display_mode: + // element DispalyMode value is case sensitive. + if (text == u"SymbolOnly") { + garmin_fs_t::set_display(gmsd, gt_display_mode_symbol); + } else if (text == u"SymbolAndDescription") { + garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_comment); + } else { + garmin_fs_t::set_display(gmsd, gt_display_mode_symbol_and_name); + } + break; + case tag_type::garmin_wpt_category: + if (auto cat = garmin_fs_t::convert_category(text); cat.has_value()) { + cat = *cat | (garmin_fs_t::get_category(gmsd, 0)); + garmin_fs_t::set_category(gmsd, *cat); + } else { + // There's nothing a user can really do about this (well, they could + // create a gpsbabel.ini that mapped them to garmin category numbers + // but that feature is so obscure and used in so few outputs that + // there's no reason to alarm the user. Just silently disregard + // category names that don't map cleanly. + // warning(MYNAME ": Unable to convert category \"%s\"!\n", CSTR(text)); + } + break; + case tag_type::garmin_wpt_addr: + garmin_fs_t::set_addr(gmsd, text); + break; + case tag_type::garmin_wpt_city: + garmin_fs_t::set_city(gmsd, text); + break; + case tag_type::garmin_wpt_state: + garmin_fs_t::set_state(gmsd, text); + break; + case tag_type::garmin_wpt_country: + garmin_fs_t::set_country(gmsd, text); + break; + case tag_type::garmin_wpt_postal_code: + garmin_fs_t::set_postal_code(gmsd, text); + break; + case tag_type::garmin_wpt_phone_nr: + garmin_fs_t::set_phone_nr(gmsd, text); + break; + default: + // do nothing + break; + } +} + void GpxFormat::start_something_else(QStringView el, const QXmlStreamAttributes& attr) { @@ -318,69 +386,70 @@ GpxFormat::gpx_start(QStringView el, const QXmlStreamAttributes& attr) tag_mapping tag = get_tag(current_tag); switch (tag.type) { - case tt_gpx: + case tag_type::gpx: tag_gpx(attr); break; - case tt_link: + case tag_type::link: if (attr.hasAttribute(QLatin1String("href"))) { link_url = attr.value(QLatin1String("href")).toString(); } break; - case tt_wpt: + case tag_type::wpt: tag_wpt(attr); break; - case tt_wpttype_link: + case tag_type::wpttype_link: if (attr.hasAttribute(QLatin1String("href"))) { link_url = attr.value(QLatin1String("href")).toString(); } break; - case tt_rte: + case tag_type::rte: rte_head = new route_head; route_add_head(rte_head); rh_link_ = new UrlLink; fs_ptr = &rte_head->fs; break; - case tt_rte_rtept: + case tag_type::rte_rtept: tag_wpt(attr); break; - case tt_trk: + case tag_type::trk: trk_head = new route_head; track_add_head(trk_head); rh_link_ = new UrlLink; fs_ptr = &trk_head->fs; break; - case tt_trk_trkseg_trkpt: + case tag_type::trk_trkseg_trkpt: tag_wpt(attr); if (next_trkpt_is_new_seg) { wpt_tmp->wpt_flags.new_trkseg = 1; next_trkpt_is_new_seg = 0; } break; - case tt_rte_link: - case tt_trk_link: + case tag_type::rte_link: + case tag_type::trk_link: if (attr.hasAttribute(QLatin1String("href"))) { link_url = attr.value(QLatin1String("href")).toString(); } break; - case tt_unknown: + case tag_type::unknown: start_something_else(el, attr); return; - case tt_cache: + case tag_type::cache: tag_gs_cache(attr); break; - case tt_cache_log_wpt: + case tag_type::cache_log_wpt: if (opt_logpoint) { tag_log_wpt(attr); } break; - case tt_cache_desc_long: - case tt_cache_desc_short: + case tag_type::cache_desc_long: + case tag_type::cache_desc_short: tag_cache_desc(attr); break; - case tt_cache_placer: + case tag_type::cache_placer: if (attr.hasAttribute(QLatin1String("id"))) { wpt_tmp->AllocGCData()->placer_id = attr.value(QLatin1String("id")).toInt(); } + break; default: break; } @@ -436,7 +505,12 @@ xml_parse_time(const QString& dateTimeString) *pointstr = '\0'; } - int year = 0, mon = 1, mday = 1, hour = 0, min = 0, sec = 0; + int year = 0; + int mon = 1; + int mday = 1; + int hour = 0; + int min = 0; + int sec = 0; gpsbabel::DateTime dt; int res = sscanf(timestr, "%d-%d-%dT%d:%d:%d", &year, &mon, &mday, &hour, &min, &sec); @@ -470,44 +544,44 @@ GpxFormat::gpx_end(QStringView /*unused*/) /* * First, the tags that are file-global. */ - case tt_name: + case tag_type::name: gpx_add_to_global(gpx_global->name, cdatastr); break; - case tt_desc: + case tag_type::desc: gpx_add_to_global(gpx_global->desc, cdatastr); break; - case tt_author: + case tag_type::author: gpx_add_to_global(gpx_global->author, cdatastr); break; - case tt_email: + case tag_type::email: gpx_add_to_global(gpx_global->email, cdatastr); break; - case tt_url: + case tag_type::url: gpx_add_to_global(gpx_global->url, cdatastr); break; - case tt_urlname: + case tag_type::urlname: gpx_add_to_global(gpx_global->urlname, cdatastr); break; - case tt_keywords: + case tag_type::keywords: gpx_add_to_global(gpx_global->keywords, cdatastr); break; - case tt_link: + case tag_type::link: (gpx_global->link).AddUrlLink(UrlLink(link_url, link_text, link_type)); link_type.clear(); link_text.clear(); link_url.clear(); break; - case tt_link_text: + case tag_type::link_text: link_text = cdatastr; break; - case tt_link_type: + case tag_type::link_type: link_type = cdatastr; break; /* * Waypoint-specific tags. */ - case tt_wpt: + case tag_type::wpt: if (link_) { if (!link_->url_.isEmpty()) { wpt_tmp->AddUrlLink(*link_); @@ -515,45 +589,50 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete link_; link_ = nullptr; } + if (wpt_fsdata != nullptr) { + wpt_tmp->fs.FsChainAdd(wpt_fsdata); + wpt_fsdata = nullptr; + } waypt_add(wpt_tmp); logpoint_ct = 0; cur_tag = nullptr; wpt_tmp = nullptr; + fs_ptr = nullptr; break; - case tt_cache_name: + case tag_type::cache_name: wpt_tmp->notes = cdatastr; break; - case tt_cache_container: + case tag_type::cache_container: wpt_tmp->AllocGCData()->set_container(cdatastr); break; - case tt_cache_type: + case tag_type::cache_type: wpt_tmp->AllocGCData()->set_type(cdatastr); break; - case tt_cache_difficulty: + case tag_type::cache_difficulty: wpt_tmp->AllocGCData()->diff = cdatastr.toFloat() * 10; break; - case tt_cache_hint: + case tag_type::cache_hint: wpt_tmp->AllocGCData()->hint = cdatastr; break; - case tt_cache_desc_long: { + case tag_type::cache_desc_long: { Geocache* gc_data = wpt_tmp->AllocGCData(); gc_data->desc_long.is_html = cache_descr_is_html; gc_data->desc_long.utf_string = cdatastr; } break; - case tt_cache_desc_short: { + case tag_type::cache_desc_short: { Geocache* gc_data = wpt_tmp->AllocGCData(); gc_data->desc_short.is_html = cache_descr_is_html; gc_data->desc_short.utf_string = cdatastr; } break; - case tt_cache_terrain: + case tag_type::cache_terrain: wpt_tmp->AllocGCData()->terr = cdatastr.toFloat() * 10; break; - case tt_cache_placer: + case tag_type::cache_placer: wpt_tmp->AllocGCData()->placer = cdatastr; break; - case tt_cache_log_date: + case tag_type::cache_log_date: gc_log_date = xml_parse_time(cdatastr); break; /* @@ -561,51 +640,51 @@ GpxFormat::gpx_end(QStringView /*unused*/) * if this is the first "found it" for this waypt, just use the * last date we saw in this log. */ - case tt_cache_log_type: + case tag_type::cache_log_type: if ((cdatastr.compare(u"Found it") == 0) && (!wpt_tmp->gc_data->last_found.isValid())) { wpt_tmp->AllocGCData()->last_found = gc_log_date; } gc_log_date = gpsbabel::DateTime(); break; - case tt_cache_favorite_points: - wpt_tmp->AllocGCData()->favorite_points = cdatastr.toInt(); + case tag_type::cache_favorite_points: + wpt_tmp->AllocGCData()->favorite_points = cdatastr.toInt(); break; - case tt_cache_personal_note: - wpt_tmp->AllocGCData()->personal_note = cdatastr; + case tag_type::cache_personal_note: + wpt_tmp->AllocGCData()->personal_note = cdatastr; break; /* * Garmin-waypoint-specific tags. */ - case tt_garmin_wpt_proximity: - case tt_garmin_wpt_temperature: - case tt_garmin_wpt_depth: - case tt_garmin_wpt_display_mode: - case tt_garmin_wpt_category: - case tt_garmin_wpt_addr: - case tt_garmin_wpt_city: - case tt_garmin_wpt_state: - case tt_garmin_wpt_country: - case tt_garmin_wpt_postal_code: - case tt_garmin_wpt_phone_nr: - garmin_fs_xml_convert(tt_garmin_wpt_extensions, tag.type, cdatastr, wpt_tmp); + case tag_type::garmin_wpt_proximity: + case tag_type::garmin_wpt_temperature: + case tag_type::garmin_wpt_depth: + case tag_type::garmin_wpt_display_mode: + case tag_type::garmin_wpt_category: + case tag_type::garmin_wpt_addr: + case tag_type::garmin_wpt_city: + case tag_type::garmin_wpt_state: + case tag_type::garmin_wpt_country: + case tag_type::garmin_wpt_postal_code: + case tag_type::garmin_wpt_phone_nr: + tag_garmin_fs(tag.type, cdatastr, wpt_tmp); break; /* * Humminbird-waypoint-specific tags. */ - case tt_humminbird_wpt_depth: - case tt_humminbird_trk_trkseg_trkpt_depth: + case tag_type::humminbird_wpt_depth: + case tag_type::humminbird_trk_trkseg_trkpt_depth: wpt_tmp->set_depth(cdatastr.toDouble() / 100.0); break; /* * Route-specific tags. */ - case tt_rte_name: + case tag_type::rte_name: rte_head->rte_name = cdatastr; break; - case tt_rte: + case tag_type::rte: if (rh_link_) { if (!rh_link_->url_.isEmpty()) { rte_head->rte_urls.AddUrlLink(*rh_link_); @@ -613,8 +692,9 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete rh_link_; rh_link_ = nullptr; } + fs_ptr = nullptr; break; - case tt_rte_rtept: + case tag_type::rte_rtept: if (link_) { if (!link_->url_.isEmpty()) { wpt_tmp->AddUrlLink(*link_); @@ -622,31 +702,36 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete link_; link_ = nullptr; } + if (wpt_fsdata != nullptr) { + wpt_tmp->fs.FsChainAdd(wpt_fsdata); + wpt_fsdata = nullptr; + } route_add_wpt(rte_head, wpt_tmp); wpt_tmp = nullptr; + fs_ptr = nullptr; break; - case tt_rte_desc: + case tag_type::rte_desc: rte_head->rte_desc = cdatastr; break; - case tt_garmin_rte_display_color: + case tag_type::garmin_rte_display_color: rte_head->line_color.bbggrr = gt_color_value_by_name(cdatastr); break; - case tt_rte_link: + case tag_type::rte_link: rte_head->rte_urls.AddUrlLink(UrlLink(link_url, link_text, link_type)); link_type.clear(); link_text.clear(); link_url.clear(); break; - case tt_rte_number: + case tag_type::rte_number: rte_head->rte_num = cdatastr.toInt(); break; /* * Track-specific tags. */ - case tt_trk_name: + case tag_type::trk_name: trk_head->rte_name = cdatastr; break; - case tt_trk: + case tag_type::trk: if (rh_link_) { if (!rh_link_->url_.isEmpty()) { trk_head->rte_urls.AddUrlLink(*rh_link_); @@ -654,11 +739,13 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete rh_link_; rh_link_ = nullptr; } + fs_ptr = nullptr; break; - case tt_trk_trkseg: + case tag_type::trk_trkseg: next_trkpt_is_new_seg = 1; + fs_ptr = nullptr; break; - case tt_trk_trkseg_trkpt: + case tag_type::trk_trkseg_trkpt: if (link_) { if (!link_->url_.isEmpty()) { wpt_tmp->AddUrlLink(*link_); @@ -666,90 +753,125 @@ GpxFormat::gpx_end(QStringView /*unused*/) delete link_; link_ = nullptr; } + if (wpt_fsdata != nullptr) { + wpt_tmp->fs.FsChainAdd(wpt_fsdata); + wpt_fsdata = nullptr; + } track_add_wpt(trk_head, wpt_tmp); wpt_tmp = nullptr; + fs_ptr = nullptr; break; - case tt_trk_desc: + case tag_type::trk_desc: trk_head->rte_desc = cdatastr; break; - case tt_garmin_trk_display_color: + case tag_type::garmin_trk_display_color: trk_head->line_color.bbggrr = gt_color_value_by_name(cdatastr); break; - case tt_trk_link: + case tag_type::trk_link: trk_head->rte_urls.AddUrlLink(UrlLink(link_url, link_text, link_type)); link_type.clear(); link_text.clear(); link_url.clear(); break; - case tt_trk_number: + case tag_type::trk_number: trk_head->rte_num = cdatastr.toInt(); break; - case tt_trk_trkseg_trkpt_course: + case tag_type::trk_trkseg_trkpt_course: wpt_tmp->set_course(cdatastr.toDouble()); break; - case tt_trk_trkseg_trkpt_speed: + case tag_type::trk_trkseg_trkpt_speed: wpt_tmp->set_speed(cdatastr.toDouble()); break; - case tt_trk_trkseg_trkpt_heartrate: + case tag_type::trk_trkseg_trkpt_heartrate: wpt_tmp->heartrate = cdatastr.toDouble(); break; - case tt_trk_trkseg_trkpt_cadence: + case tag_type::trk_trkseg_trkpt_cadence: wpt_tmp->cadence = cdatastr.toDouble(); break; /* * Items that are actually in multiple categories. */ - case tt_rte_url: - case tt_trk_url: + case tag_type::rte_url: + case tag_type::trk_url: rh_link_->url_ = cdatastr; break; - case tt_rte_urlname: - case tt_trk_urlname: + case tag_type::rte_urlname: + case tag_type::trk_urlname: rh_link_->url_link_text_ = cdatastr; break; - case tt_rte_link_text: - case tt_trk_link_text: + case tag_type::rte_link_text: + case tag_type::trk_link_text: link_text = cdatastr; break; - case tt_rte_link_type: - case tt_trk_link_type: + case tag_type::rte_link_type: + case tag_type::trk_link_type: link_type = cdatastr; break; - case tt_wpttype_ele: + case tag_type::wpttype_ele: wpt_tmp->altitude = cdatastr.toDouble(); break; - case tt_wpttype_name: + case tag_type::wpttype_name: wpt_tmp->shortname = cdatastr; break; - case tt_wpttype_sym: + case tag_type::wpttype_sym: wpt_tmp->icon_descr = cdatastr; break; - case tt_wpttype_time: + case tag_type::wpttype_time: wpt_tmp->SetCreationTime(xml_parse_time(cdatastr)); break; - case tt_wpttype_geoidheight: + case tag_type::wpttype_magvar: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->magvar = cdatastr; + break; + case tag_type::wpttype_geoidheight: wpt_tmp->set_geoidheight(cdatastr.toDouble()); break; - case tt_wpttype_cmt: + case tag_type::wpttype_cmt: wpt_tmp->description = cdatastr; break; - case tt_wpttype_desc: + case tag_type::wpttype_desc: wpt_tmp->notes = cdatastr; break; - case tt_wpttype_pdop: + case tag_type::wpttype_src: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->src = cdatastr; + break; + case tag_type::wpttype_type: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->type = cdatastr; + break; + case tag_type::wpttype_pdop: wpt_tmp->pdop = cdatastr.toFloat(); break; - case tt_wpttype_hdop: + case tag_type::wpttype_hdop: wpt_tmp->hdop = cdatastr.toFloat(); break; - case tt_wpttype_vdop: + case tag_type::wpttype_vdop: wpt_tmp->vdop = cdatastr.toFloat(); break; - case tt_wpttype_sat: + case tag_type::wpttype_ageofdgpsdata: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->ageofdgpsdata = cdatastr; + break; + case tag_type::wpttype_dgpsid: + if (wpt_fsdata == nullptr) { + wpt_fsdata = new gpx_wpt_fsdata; + } + wpt_fsdata->dgpsid = cdatastr; + break; + case tag_type::wpttype_sat: wpt_tmp->sat = cdatastr.toInt(); break; - case tt_wpttype_fix: + case tag_type::wpttype_fix: if (cdatastr == QLatin1String("none")) { wpt_tmp->fix = fix_none; } else if (cdatastr == QLatin1String("2d")) { @@ -764,25 +886,25 @@ GpxFormat::gpx_end(QStringView /*unused*/) wpt_tmp->fix = fix_unknown; } break; - case tt_wpttype_url: + case tag_type::wpttype_url: link_->url_ = cdatastr; break; - case tt_wpttype_urlname: + case tag_type::wpttype_urlname: link_->url_link_text_ = cdatastr; break; - case tt_wpttype_link: + case tag_type::wpttype_link: waypt_add_url(wpt_tmp, link_url, link_text, link_type); link_type.clear(); link_text.clear(); link_url.clear(); break; - case tt_wpttype_link_text: + case tag_type::wpttype_link_text: link_text = cdatastr; break; - case tt_wpttype_link_type: + case tag_type::wpttype_link_type: link_type = cdatastr; break; - case tt_unknown: + case tag_type::unknown: end_something_else(); return; default: @@ -879,7 +1001,7 @@ GpxFormat::wr_init(const QString& fname) // normalization makes them null. if (gpx_write_version.isNull() || (gpx_write_version < gpx_1_0)) { fatal(FatalMsg() << MYNAME ": gpx version number" - << gpx_write_version << "not valid."); + << gpx_write_version << "not valid."); } writer->setAutoFormatting(true); @@ -934,7 +1056,7 @@ GpxFormat::wr_init(const QString& fname) } else { if (gpx_global) { // TODO: gpx 1.1 copyright goes here - for (const auto& l : qAsConst(gpx_global->link)) { + for (const auto& l : std::as_const(gpx_global->link)) { writer->writeStartElement(QStringLiteral("link")); writer->writeAttribute(QStringLiteral("href"), l.url_); writer->writeOptionalTextElement(QStringLiteral("text"), l.url_link_text_); @@ -971,7 +1093,8 @@ GpxFormat::wr_deinit() delete oqfile; oqfile = nullptr; - mkshort_del_handle(&mkshort_handle); + delete mkshort_handle; + mkshort_handle = nullptr; } QString @@ -981,10 +1104,11 @@ GpxFormat::qualifiedName() const * file. So we map from the namespaceUris to the prefixes used in our * hash table. */ - static const QHash tag_ns_prefixes = { + static const QHash tag_ns_prefixes = { {"http://www.garmin.com/xmlschemas/GpxExtensions/v3", "gpxx"}, {"http://www.garmin.com/xmlschemas/TrackPointExtension/v1", "gpxtpx"}, {"http://www.groundspeak.com/cache/1/0", "groundspeak"}, + {"http://www.groundspeak.com/cache/1/0/1", "groundspeak"}, {"http://humminbird.com", "h"} }; @@ -998,7 +1122,7 @@ GpxFormat::qualifiedName() const void GpxFormat::read() { - for (bool atEnd = false; !reader->atEnd() && !atEnd;) { + for (bool atEnd = false; !reader->atEnd() && !atEnd;) { reader->readNext(); // do processing switch (reader->tokenType()) { @@ -1048,11 +1172,11 @@ GpxFormat::read() } } - if (reader->hasError()) { + if (reader->hasError()) { fatal(FatalMsg() << MYNAME << "Read error:" << reader->errorString() - << "File:" << iqfile->fileName() - << "Line:" << reader->lineNumber() - << "Column:" << reader->columnNumber()); + << "File:" << iqfile->fileName() + << "Line:" << reader->lineNumber() + << "Column:" << reader->columnNumber()); } } @@ -1065,7 +1189,7 @@ GpxFormat::write_attributes(const QXmlStreamAttributes& attributes) const } void -GpxFormat::fprint_xml_chain(XmlTag* tag, const Waypoint* wpt) const +GpxFormat::fprint_xml_chain(const XmlTag* tag) const { while (tag) { writer->writeStartElement(tag->tagname); @@ -1078,12 +1202,7 @@ GpxFormat::fprint_xml_chain(XmlTag* tag, const Waypoint* wpt) const writer->writeCharacters(tag->cdata); } if (tag->child) { - fprint_xml_chain(tag->child, wpt); - } - if (wpt && wpt->gc_data->exported.isValid() && - tag->tagname.compare(u"groundspeak:cache") == 0) { - writer->writeTextElement(QStringLiteral("time"), - wpt->gc_data->exported.toPrettyString()); + fprint_xml_chain(tag->child); } writer->writeEndElement(); } @@ -1113,7 +1232,7 @@ GpxFormat::write_gpx_url(const UrlList& urls) const } } } else { - UrlLink l = urls.GetUrlLink(); + const UrlLink& l = urls.GetUrlLink(); if (!l.url_.isEmpty()) { writer->writeTextElement(QStringLiteral("url"), QString(urlbase) + l.url_); writer->writeOptionalTextElement(QStringLiteral("urlname"), l.url_link_text_); @@ -1143,7 +1262,7 @@ GpxFormat::write_gpx_url(const route_head* rh) const * Order counts. */ void -GpxFormat::gpx_write_common_acc(const Waypoint* waypointp) const +GpxFormat::gpx_write_common_acc(const Waypoint* waypointp, const gpx_wpt_fsdata* fs_gpxwpt) const { const char* fix = nullptr; @@ -1184,13 +1303,15 @@ GpxFormat::gpx_write_common_acc(const Waypoint* waypointp) const if (waypointp->pdop) { writer->writeTextElement(QStringLiteral("pdop"), toString(waypointp->pdop)); } - /* TODO: ageofdgpsdata should go here */ - /* TODO: dgpsid should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("ageofdgpsdata"), fs_gpxwpt->ageofdgpsdata); + writer->writeOptionalTextElement(QStringLiteral("dgpsid"), fs_gpxwpt->dgpsid); + } } void -GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_type point_type) const +GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const { if (waypointp->altitude != unknown_alt) { writer->writeTextElement(QStringLiteral("ele"), QString::number(waypointp->altitude, 'f', elevation_precision)); @@ -1206,7 +1327,9 @@ GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_ writer->writeTextElement(QStringLiteral("speed"), toString(waypointp->speed_value())); } } - /* TODO: magvar should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("magvar"), fs_gpxwpt->magvar); + } if (waypointp->geoidheight_has_value()) { writer->writeOptionalTextElement(QStringLiteral("geoidheight"),QString::number(waypointp->geoidheight_value(), 'f', 1)); } @@ -1215,92 +1338,127 @@ GpxFormat::gpx_write_common_position(const Waypoint* waypointp, const gpx_point_ void GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_point_type point_type) const { - // gpx version we are writing is >= 1.1. - garmin_fs_t* gmsd = (opt_garminext) ? garmin_fs_t::find(waypointp) : nullptr; // only needed if garmin extensions selected + assert(gpx_write_version >= gpx_1_1); - if ((opt_humminbirdext && (waypointp->depth_has_value() || waypointp->temperature_has_value())) || - (opt_garminext && gpxpt_route==point_type && gmsd != nullptr && gmsd->ilinks != nullptr) || - (opt_garminext && gpxpt_waypoint==point_type && (waypointp->proximity_has_value() || waypointp->temperature_has_value() || waypointp->depth_has_value())) || - (opt_garminext && gpxpt_track==point_type && (waypointp->temperature_has_value() || waypointp->depth_has_value() || waypointp->heartrate != 0 || waypointp->cadence != 0))) { - writer->writeStartElement(QStringLiteral("extensions")); + writer->stackOptionalStartElement(QStringLiteral("extensions")); - if (opt_humminbirdext) { - if (waypointp->depth_has_value()) { - writer->writeTextElement(QStringLiteral("h:depth"), toString(waypointp->depth_value() * 100.0)); + if (opt_humminbirdext) { + if (waypointp->depth_has_value()) { + writer->stackTextElement(QStringLiteral("h:depth"), toString(waypointp->depth_value() * 100.0)); + } + if (waypointp->temperature_has_value()) { + writer->stackTextElement(QStringLiteral("h:temperature"), toString(waypointp->temperature_value())); + } + } + + if (opt_garminext) { + // Although not required by the schema we assume that gpxx:WaypointExtension must be a child of gpx:wpt. + // Although not required by the schema we assume that gpxx:RoutePointExtension must be a child of gpx:rtept. + // Although not required by the schema we assume that gpxx:TrackPointExtension must be a child of gpx:trkpt. + // Although not required by the schema we assume that gpxtpx:TrackPointExtension must be a child of gpx:trkpt. + const garmin_fs_t* gmsd = garmin_fs_t::find(waypointp); + switch (point_type) { + case gpxpt_waypoint: + writer->stackOptionalStartElement(QStringLiteral("gpxx:WaypointExtension")); + if (waypointp->proximity_has_value()) { + writer->stackTextElement(QStringLiteral("gpxx:Proximity"), toString(waypointp->proximity_value())); } if (waypointp->temperature_has_value()) { - writer->writeTextElement(QStringLiteral("h:temperature"), toString(waypointp->temperature_value())); + writer->stackTextElement(QStringLiteral("gpxx:Temperature"), toString(waypointp->temperature_value())); + } + if (waypointp->depth_has_value()) { + writer->stackTextElement(QStringLiteral("gpxx:Depth"), toString(waypointp->depth_value())); } - } - if (opt_garminext) { - // Although not required by the schema we assume that gpxx:WaypointExtension must be a child of gpx:wpt. - // Although not required by the schema we assume that gpxx:RoutePointExtension must be a child of gpx:rtept. - // Although not required by the schema we assume that gpxx:TrackPointExtension must be a child of gpx:trkpt. - // Although not required by the schema we assume that gpxtpx:TrackPointExtension must be a child of gpx:trkpt. - switch (point_type) { - case gpxpt_waypoint: - if (waypointp->proximity_has_value() || waypointp->temperature_has_value() || waypointp->depth_has_value()) { - writer->writeStartElement(QStringLiteral("gpxx:WaypointExtension")); - if (waypointp->proximity_has_value()) { - writer->writeTextElement(QStringLiteral("gpxx:Proximity"), toString(waypointp->proximity_value())); - } - if (waypointp->temperature_has_value()) { - writer->writeTextElement(QStringLiteral("gpxx:Temperature"), toString(waypointp->temperature_value())); - } - if (waypointp->depth_has_value()) { - writer->writeTextElement(QStringLiteral("gpxx:Depth"), toString(waypointp->depth_value())); - } - writer->writeEndElement(); // "gpxx:WaypointExtension" + if (garmin_fs_t::has_display(gmsd)) { + const char* cx; + switch (gmsd->display) { + case gt_display_mode_symbol: + cx = "SymbolOnly"; + break; + case gt_display_mode_symbol_and_comment: + cx = "SymbolAndDescription"; + break; + default: + cx = "SymbolAndName"; + break; } - break; - case gpxpt_route: - if (gmsd != nullptr && gpxpt_route==point_type && gmsd->ilinks != nullptr) { - writer->writeStartElement(QStringLiteral("gpxx:RoutePointExtension")); - garmin_ilink_t* link = gmsd->ilinks; - garmin_ilink_t* prior = nullptr; // GDB files sometime contain repeated point; omit them - while (link != nullptr) { - if (prior == nullptr || prior->lat != link->lat || prior->lon != link->lon) { - writer->writeStartElement(QStringLiteral("gpxx:rpt")); - writer->writeAttribute(QStringLiteral("lat"), toString(link->lat)); - writer->writeAttribute(QStringLiteral("lon"), toString(link->lon)); - writer->writeEndElement(); // "gpxx:rpt" - } - prior = link; - link = link->next; - } - writer->writeEndElement(); // "gpxx:RoutePointExtension" + writer->stackTextElement(QStringLiteral("gpxx:DisplayMode"), cx); + } + + if (garmin_fs_t::has_category(gmsd)) { + uint16_t cx = gmsd->category; + writer->stackStartElement(QStringLiteral("gpxx:Categories")); + const QStringList categoryList = garmin_fs_t::print_categories(cx); + for (const auto& text : categoryList) { + writer->stackTextElement(QStringLiteral("gpxx:Category"), text); } - break; - case gpxpt_track: - if (waypointp->temperature_has_value() || waypointp->depth_has_value() || waypointp->heartrate != 0 || waypointp->cadence != 0) { - // gpxtpx:TrackPointExtension is a replacement for gpxx:TrackPointExtension. - writer->writeStartElement(QStringLiteral("gpxtpx:TrackPointExtension")); - if (waypointp->temperature_has_value()) { - writer->writeTextElement(QStringLiteral("gpxtpx:atemp"), toString(waypointp->temperature_value())); - } - if (waypointp->depth_has_value()) { - writer->writeTextElement(QStringLiteral("gpxtpx:depth"), toString(waypointp->depth_value())); - } - if (waypointp->heartrate != 0) { - writer->writeTextElement(QStringLiteral("gpxtpx:hr"), QString::number(waypointp->heartrate)); - } - if (waypointp->cadence != 0) { - writer->writeTextElement(QStringLiteral("gpxtpx:cad"), QString::number(waypointp->cadence)); + writer->stackEndElement(); // gpxx:Categories + } + + writer->stackOptionalStartElement(QStringLiteral("gpxx:Address")); + writer->stackOptionalTextElement(QStringLiteral("gpxx:StreetAddress"), garmin_fs_t::get_addr(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:City"), garmin_fs_t::get_city(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:State"), garmin_fs_t::get_state(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:Country"), garmin_fs_t::get_country(gmsd, nullptr)); + writer->stackOptionalTextElement(QStringLiteral("gpxx:PostalCode"), garmin_fs_t::get_postal_code(gmsd, nullptr)); + writer->stackEndElement(); // gpxx:Address + + writer->stackOptionalTextElement(QStringLiteral("gpxx:PhoneNumber"), garmin_fs_t::get_phone_nr(gmsd, nullptr)); + + writer->stackEndElement(); // gpxx:WaypointExtension + break; + case gpxpt_route: + if (gmsd != nullptr && !gmsd->ilinks.isEmpty()) { + writer->stackOptionalStartElement(QStringLiteral("gpxx:RoutePointExtension")); + double prior_lat; // GDB files sometime contain repeated point; omit them + double prior_lon; + bool first = true; + for (const auto& link : gmsd->ilinks) { + if (first || (prior_lat != link.lat) || (prior_lon != link.lon)) { + writer->stackStartElement(QStringLiteral("gpxx:rpt")); + writer->stackAttribute(QStringLiteral("lat"), toString(link.lat)); + writer->stackAttribute(QStringLiteral("lon"), toString(link.lon)); + writer->stackEndElement(); // "gpxx:rpt" + prior_lat = link.lat; + prior_lon = link.lon; + first = false; } - writer->writeEndElement(); // "gpxtpx:TrackPointExtension" } - break; + writer->stackEndElement(); // gpxx:RoutePointExtension } + break; + case gpxpt_track: + // gpxtpx:TrackPointExtension is a replacement for gpxx:TrackPointExtension. + writer->stackOptionalStartElement(QStringLiteral("gpxtpx:TrackPointExtension")); + if (waypointp->temperature_has_value()) { + writer->stackTextElement(QStringLiteral("gpxtpx:atemp"), toString(waypointp->temperature_value())); + } + if (waypointp->depth_has_value()) { + writer->stackTextElement(QStringLiteral("gpxtpx:depth"), toString(waypointp->depth_value())); + } + if (waypointp->heartrate != 0) { + writer->stackTextElement(QStringLiteral("gpxtpx:hr"), QString::number(waypointp->heartrate)); + } + if (waypointp->cadence != 0) { + writer->stackTextElement(QStringLiteral("gpxtpx:cad"), QString::number(waypointp->cadence)); + } + writer->stackEndElement(); // gpxtpx:TrackPointExtension + break; } - - writer->writeEndElement(); // "extensions" } + + writer->stackEndElement(); // "extensions" } void -GpxFormat::gpx_write_common_description(const Waypoint* waypointp, const QString& oname) const +GpxFormat::gpx_write_common_description(const Waypoint* waypointp, const gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const { + QString oname; + if (!((point_type == gpxpt_track) && waypointp->wpt_flags.shortname_is_synthetic)) { + oname = global_opts.synthesize_shortnames ? + mkshort_handle->mkshort_from_wpt(waypointp) : waypointp->shortname; + } writer->writeOptionalTextElement(QStringLiteral("name"), oname); writer->writeOptionalTextElement(QStringLiteral("cmt"), waypointp->description); @@ -1309,10 +1467,24 @@ GpxFormat::gpx_write_common_description(const Waypoint* waypointp, const QString } else { writer->writeOptionalTextElement(QStringLiteral("desc"), waypointp->description); } - /* TODO: src should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("src"), fs_gpxwpt->src); + } write_gpx_url(waypointp); writer->writeOptionalTextElement(QStringLiteral("sym"), waypointp->icon_descr); - /* TODO: type should go here */ + if (fs_gpxwpt) { + writer->writeOptionalTextElement(QStringLiteral("type"), fs_gpxwpt->type); + } +} + +void GpxFormat::gpx_write_common_core(const Waypoint* waypointp, + const gpx_point_type point_type) const +{ + const auto* fs_gpxwpt = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpxWpt)); + + gpx_write_common_position(waypointp, point_type, fs_gpxwpt); + gpx_write_common_description(waypointp, point_type, fs_gpxwpt); + gpx_write_common_acc(waypointp, fs_gpxwpt); } void @@ -1322,24 +1494,12 @@ GpxFormat::gpx_waypt_pr(const Waypoint* waypointp) const writer->writeAttribute(QStringLiteral("lat"), toString(waypointp->latitude)); writer->writeAttribute(QStringLiteral("lon"), toString(waypointp->longitude)); - QString oname = global_opts.synthesize_shortnames ? - mkshort_from_wpt(mkshort_handle, waypointp) : - waypointp->shortname; - gpx_write_common_position(waypointp, gpxpt_waypoint); - gpx_write_common_description(waypointp, oname); - gpx_write_common_acc(waypointp); + gpx_write_common_core(waypointp, gpxpt_waypoint); if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); - auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */ - if (fs_gpx) { - if (! gmsd) { - fprint_xml_chain(fs_gpx->tag, waypointp); - } - } - if (gmsd && (gpx_write_version > gpx_1_0)) { - /* MapSource doesn't accepts extensions from 1.0 */ - garmin_fs_xml_fprint(waypointp, writer); + if (fs_gpx && fs_gpx->tag) { + fprint_xml_chain(fs_gpx->tag); } } else { gpx_write_common_extensions(waypointp, gpxpt_waypoint); @@ -1361,23 +1521,21 @@ GpxFormat::gpx_track_hdr(const route_head* rte) writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num)); } - if (gpx_write_version > gpx_1_0) { - if (!(opt_humminbirdext || opt_garminext)) { - const auto* fs_gpx = reinterpret_cast(rte->fs.FsChainFind(kFsGpx)); - if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, nullptr); - } - } else if (opt_garminext) { - if (rte->line_color.bbggrr > unknown_color) { - int ci = gt_color_index_by_rgb(rte->line_color.bbggrr); - if (ci > 0) { - writer->writeStartElement(QStringLiteral("extensions")); - writer->writeStartElement(QStringLiteral("gpxx:TrackExtension")); - writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1") - .arg(gt_color_name(ci))); - writer->writeEndElement(); // Close gpxx:TrackExtension tag - writer->writeEndElement(); // Close extensions tag - } + if (!(opt_humminbirdext || opt_garminext)) { + const auto* fs_gpx = reinterpret_cast(rte->fs.FsChainFind(kFsGpx)); + if (fs_gpx) { + fprint_xml_chain(fs_gpx->tag); + } + } else if (opt_garminext) { + if (rte->line_color.bbggrr > unknown_color) { + int ci = gt_color_index_by_rgb(rte->line_color.bbggrr); + if (ci > 0) { + writer->writeStartElement(QStringLiteral("extensions")); + writer->writeStartElement(QStringLiteral("gpxx:TrackExtension")); + writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1") + .arg(gt_color_name(ci))); + writer->writeEndElement(); // Close gpxx:TrackExtension tag + writer->writeEndElement(); // Close extensions tag } } } @@ -1399,20 +1557,12 @@ GpxFormat::gpx_track_disp(const Waypoint* waypointp) const writer->writeAttribute(QStringLiteral("lat"), toString(waypointp->latitude)); writer->writeAttribute(QStringLiteral("lon"), toString(waypointp->longitude)); - gpx_write_common_position(waypointp, gpxpt_track); - - QString oname = global_opts.synthesize_shortnames ? - mkshort_from_wpt(mkshort_handle, waypointp) : - waypointp->shortname; - gpx_write_common_description(waypointp, - waypointp->wpt_flags.shortname_is_synthetic ? - nullptr : oname); - gpx_write_common_acc(waypointp); + gpx_write_common_core(waypointp, gpxpt_track); if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, waypointp); + fprint_xml_chain(fs_gpx->tag); } } else { gpx_write_common_extensions(waypointp, gpxpt_track); @@ -1459,25 +1609,23 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num)); } - if (gpx_write_version > gpx_1_0) { - if (!(opt_humminbirdext || opt_garminext)) { - const auto* fs_gpx = reinterpret_cast(rte->fs.FsChainFind(kFsGpx)); - if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, nullptr); - } - } else if (opt_garminext) { - if (rte->line_color.bbggrr > unknown_color) { - int ci = gt_color_index_by_rgb(rte->line_color.bbggrr); - if (ci > 0) { - writer->writeStartElement(QStringLiteral("extensions")); - writer->writeStartElement(QStringLiteral("gpxx:RouteExtension")); - // FIXME: the value to use for IsAutoNamed is questionable. - writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element - writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1") - .arg(gt_color_name(ci))); - writer->writeEndElement(); // Close gpxx:RouteExtension tag - writer->writeEndElement(); // Close extensions tag - } + if (!(opt_humminbirdext || opt_garminext)) { + const auto* fs_gpx = reinterpret_cast(rte->fs.FsChainFind(kFsGpx)); + if (fs_gpx) { + fprint_xml_chain(fs_gpx->tag); + } + } else if (opt_garminext) { + if (rte->line_color.bbggrr > unknown_color) { + int ci = gt_color_index_by_rgb(rte->line_color.bbggrr); + if (ci > 0) { + writer->writeStartElement(QStringLiteral("extensions")); + writer->writeStartElement(QStringLiteral("gpxx:RouteExtension")); + // FIXME: the value to use for IsAutoNamed is questionable. + writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element + writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1") + .arg(gt_color_name(ci))); + writer->writeEndElement(); // Close gpxx:RouteExtension tag + writer->writeEndElement(); // Close extensions tag } } } @@ -1490,17 +1638,12 @@ GpxFormat::gpx_route_disp(const Waypoint* waypointp) const writer->writeAttribute(QStringLiteral("lat"), toString(waypointp->latitude)); writer->writeAttribute(QStringLiteral("lon"), toString(waypointp->longitude)); - QString oname = global_opts.synthesize_shortnames ? - mkshort_from_wpt(mkshort_handle, waypointp) : - waypointp->shortname; - gpx_write_common_position(waypointp, gpxpt_route); - gpx_write_common_description(waypointp, oname); - gpx_write_common_acc(waypointp); + gpx_write_common_core(waypointp, gpxpt_route); if (!(opt_humminbirdext || opt_garminext)) { const auto* fs_gpx = reinterpret_cast(waypointp->fs.FsChainFind(kFsGpx)); if (fs_gpx) { - fprint_xml_chain(fs_gpx->tag, waypointp); + fprint_xml_chain(fs_gpx->tag); } } else { gpx_write_common_extensions(waypointp, gpxpt_route); diff --git a/gpx.h b/gpx.h index f02da3b21..741c91bb8 100644 --- a/gpx.h +++ b/gpx.h @@ -34,6 +34,7 @@ #include "defs.h" #include "format.h" // for Format #include "formspec.h" // for FormatSpecificData +#include "mkshort.h" // for MakeShort #include "src/core/file.h" // for File #include "src/core/xmlstreamwriter.h" // for XmlStreamWriter #include "src/core/xmltag.h" // for xml_tag @@ -66,115 +67,147 @@ class GpxFormat : public Format void exit() override; private: + /* + * This structure holds the element contents of elements in the + * the gpx namespace that are only passed from the gpx reader to + * the gpx writer. + * We explcitly write these instead of passing them through so they + * are written in the correct sequence. + */ + struct gpx_wpt_fsdata : FormatSpecificData { + gpx_wpt_fsdata() : FormatSpecificData(kFsGpxWpt) {} + + gpx_wpt_fsdata* clone() const override + { + return new gpx_wpt_fsdata(*this); + } + + QString magvar; + QString src; + QString type; + QString ageofdgpsdata; + QString dgpsid; + }; + enum gpx_point_type { gpxpt_waypoint, gpxpt_track, gpxpt_route }; - enum tag_type { - tt_unknown = 0, - tt_gpx, - - tt_name, /* Optional file-level info */ - tt_desc, - tt_author, - tt_email, - tt_url, - tt_urlname, - tt_keywords, - tt_link, - tt_link_text, - tt_link_type, - - tt_wpt, - tt_wpttype_ele, - tt_wpttype_time, - tt_wpttype_geoidheight, - tt_wpttype_name, - tt_wpttype_cmt, - tt_wpttype_desc, - tt_wpttype_url, /* Not in GPX 1.1 */ - tt_wpttype_urlname, /* Not in GPX 1.1 */ - tt_wpttype_link, /* New in GPX 1.1 */ - tt_wpttype_link_text, /* New in GPX 1.1 */ - tt_wpttype_link_type, /* New in GPX 1.1 */ - tt_wpttype_sym, - tt_wpttype_type, - tt_wpttype_fix, - tt_wpttype_sat, - tt_wpttype_hdop, /* HDOPS are common for all three */ - tt_wpttype_vdop, /* VDOPS are common for all three */ - tt_wpttype_pdop, /* PDOPS are common for all three */ - tt_cache, - tt_cache_name, - tt_cache_container, - tt_cache_type, - tt_cache_difficulty, - tt_cache_terrain, - tt_cache_hint, - tt_cache_desc_short, - tt_cache_desc_long, - tt_cache_log_wpt, - tt_cache_log_type, - tt_cache_log_date, - tt_cache_placer, - tt_cache_favorite_points, - tt_cache_personal_note, - - tt_wpt_extensions, - - tt_garmin_wpt_extensions, /* don't change this order */ - tt_garmin_wpt_proximity, - tt_garmin_wpt_temperature, - tt_garmin_wpt_depth, - tt_garmin_wpt_display_mode, - tt_garmin_wpt_categories, - tt_garmin_wpt_category, - tt_garmin_wpt_addr, - tt_garmin_wpt_city, - tt_garmin_wpt_state, - tt_garmin_wpt_country, - tt_garmin_wpt_postal_code, - tt_garmin_wpt_phone_nr, /* don't change this order */ - - tt_rte, - tt_rte_name, - tt_rte_desc, - tt_rte_cmt, - tt_rte_url, /* Not in GPX 1.1 */ - tt_rte_urlname, /* Not in GPX 1.1 */ - tt_rte_link, /* New in GPX 1.1 */ - tt_rte_link_text, /* New in GPX 1.1 */ - tt_rte_link_type, /* New in GPX 1.1 */ - tt_rte_number, - tt_garmin_rte_display_color, - tt_rte_rtept, - tt_trk, - tt_trk_desc, - tt_trk_name, - tt_trk_trkseg, - tt_trk_url, /* Not in GPX 1.1 */ - tt_trk_urlname, /* Not in GPX 1.1 */ - tt_trk_link, /* New in GPX 1.1 */ - tt_trk_link_text, /* New in GPX 1.1 */ - tt_trk_link_type, /* New in GPX 1.1 */ - tt_trk_number, - tt_garmin_trk_display_color, - tt_trk_trkseg_trkpt, - tt_trk_trkseg_trkpt_course, /* Not in GPX 1.1 */ - tt_trk_trkseg_trkpt_speed, /* Not in GPX 1.1 */ - tt_trk_trkseg_trkpt_heartrate, - tt_trk_trkseg_trkpt_cadence, - - tt_humminbird_wpt_depth, - tt_humminbird_wpt_status, - tt_humminbird_trk_trkseg_trkpt_depth, + enum class tag_type { + unknown = 0, + gpx, + + name, /* Optional file-level info */ + desc, + author, + email, + url, + urlname, + keywords, + link, + link_text, + link_type, + + wpt, + wpttype_ele, + wpttype_time, + wpttype_magvar, + wpttype_geoidheight, + wpttype_name, + wpttype_cmt, + wpttype_desc, + wpttype_src, + wpttype_url, /* Not in GPX 1.1 */ + wpttype_urlname, /* Not in GPX 1.1 */ + wpttype_link, /* New in GPX 1.1 */ + wpttype_link_text, /* New in GPX 1.1 */ + wpttype_link_type, /* New in GPX 1.1 */ + wpttype_sym, + wpttype_type, + wpttype_fix, + wpttype_sat, + wpttype_hdop, /* HDOPS are common for all three */ + wpttype_vdop, /* VDOPS are common for all three */ + wpttype_pdop, /* PDOPS are common for all three */ + wpttype_ageofdgpsdata, + wpttype_dgpsid, + cache, + cache_name, + cache_container, + cache_type, + cache_difficulty, + cache_terrain, + cache_hint, + cache_desc_short, + cache_desc_long, + cache_log_wpt, + cache_log_type, + cache_log_date, + cache_placer, + cache_favorite_points, + cache_personal_note, + + wpt_extensions, + + garmin_wpt_extensions, + garmin_wpt_proximity, + garmin_wpt_temperature, + garmin_wpt_depth, + garmin_wpt_display_mode, + garmin_wpt_categories, + garmin_wpt_category, + garmin_wpt_addr, + garmin_wpt_city, + garmin_wpt_state, + garmin_wpt_country, + garmin_wpt_postal_code, + garmin_wpt_phone_nr, + + rte, + rte_name, + rte_desc, + rte_cmt, + rte_url, /* Not in GPX 1.1 */ + rte_urlname, /* Not in GPX 1.1 */ + rte_link, /* New in GPX 1.1 */ + rte_link_text, /* New in GPX 1.1 */ + rte_link_type, /* New in GPX 1.1 */ + rte_number, + garmin_rte_display_color, + rte_rtept, + trk, + trk_desc, + trk_name, + trk_trkseg, + trk_url, /* Not in GPX 1.1 */ + trk_urlname, /* Not in GPX 1.1 */ + trk_link, /* New in GPX 1.1 */ + trk_link_text, /* New in GPX 1.1 */ + trk_link_type, /* New in GPX 1.1 */ + trk_number, + garmin_trk_display_color, + trk_trkseg_trkpt, + trk_trkseg_trkpt_course, /* Not in GPX 1.1 */ + trk_trkseg_trkpt_speed, /* Not in GPX 1.1 */ + trk_trkseg_trkpt_heartrate, + trk_trkseg_trkpt_cadence, + + humminbird_wpt_depth, + humminbird_wpt_status, + humminbird_trk_trkseg_trkpt_depth, }; struct tag_mapping { - tag_type type{tt_unknown}; /* enum from above for this tag */ - bool passthrough{true}; /* true if we don't generate this */ + tag_type type{tag_type::unknown}; /* enum from above for this tag */ + /* + * passthrough should be true for + * 1) The gpx 1.1 extensions element and any descendents. + * 2) Any element from a foreign (non gpx) namespace and any descendents. + * This rule is necessary for gpx 1.0. + */ + bool passthrough{true}; }; @@ -188,6 +221,7 @@ class GpxFormat : public Format void tag_wpt(const QXmlStreamAttributes& attr); void tag_cache_desc(const QXmlStreamAttributes& attr); void tag_gs_cache(const QXmlStreamAttributes& attr) const; + static void tag_garmin_fs(tag_type tag, const QString& text, Waypoint* waypt); void start_something_else(QStringView el, const QXmlStreamAttributes& attr); void end_something_else(); void tag_log_wpt(const QXmlStreamAttributes& attr) const; @@ -196,15 +230,16 @@ class GpxFormat : public Format void gpx_cdata(QStringView s); QString qualifiedName() const; void write_attributes(const QXmlStreamAttributes& attributes) const; - void fprint_xml_chain(XmlTag* tag, const Waypoint* wpt) const; + void fprint_xml_chain(const XmlTag* tag) const; void write_gpx_url(const UrlList& urls) const; void write_gpx_url(const Waypoint* waypointp) const; void write_gpx_url(const route_head* rh) const; - void gpx_write_common_acc(const Waypoint* waypointp) const; - void gpx_write_common_position(const Waypoint* waypointp, gpx_point_type point_type) const; + void gpx_write_common_acc(const Waypoint* waypointp, const gpx_wpt_fsdata* fs_gpxwpt) const; + void gpx_write_common_position(const Waypoint* waypointp, gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const; void gpx_write_common_extensions(const Waypoint* waypointp, gpx_point_type point_type) const; - void gpx_write_common_description(const Waypoint* waypointp, const QString& oname) const; + void gpx_write_common_description(const Waypoint* waypointp, gpx_point_type point_type, const gpx_wpt_fsdata* fs_gpxwpt) const; void gpx_waypt_pr(const Waypoint* waypointp) const; + void gpx_write_common_core(const Waypoint* waypointp, gpx_point_type point_type) const; void gpx_track_hdr(const route_head* rte); void gpx_track_disp(const Waypoint* waypointp) const; void gpx_track_tlr(const route_head* unused); @@ -243,7 +278,7 @@ class GpxFormat : public Format gpsbabel::File* iqfile{}; gpsbabel::File* oqfile{}; gpsbabel::XmlStreamWriter* writer{}; - short_handle mkshort_handle{}; + MakeShort* mkshort_handle{}; QString link_url; QString link_text; QString link_type; @@ -260,6 +295,7 @@ class GpxFormat : public Format int next_trkpt_is_new_seg{}; FormatSpecificDataList* fs_ptr{}; + gpx_wpt_fsdata* wpt_fsdata{nullptr}; /* * The file-level information. @@ -297,9 +333,7 @@ class GpxFormat : public Format {"/gpx/metadata/" name, {type, false}} #define GEOTAG(type,name) \ - {"/gpx/wpt/groundspeak:cache/groundspeak:" name, {type, true}}, \ - {"/gpx/wpt/extensions/cache/" name, {type, true}}, \ - {"/gpx/wpt/geocache/" name, {type, true}} /* opencaching.de */ + {"/gpx/wpt/groundspeak:cache/groundspeak:" name, {type, true}} #define GPXWPTTYPETAG(name,type,passthrough) \ {"/gpx/wpt/" name, {type, passthrough}}, \ @@ -313,117 +347,117 @@ class GpxFormat : public Format // Maintain a fast mapping from full tag names to the struct above. const QHash hash = { - {"/gpx", {tt_gpx, false}}, - METATAG(tt_name, "name"), - METATAG(tt_desc, "desc"), - {"/gpx/author", {tt_author, false}}, - {"/gpx/email", {tt_email, false}}, - {"/gpx/url", {tt_url, false}}, - {"/gpx/urlname", {tt_urlname, false}}, - METATAG(tt_keywords, "keywords"), - {"/gpx/metadata/link", {tt_link, false}}, - {"/gpx/metadata/link/text", {tt_link_text, false}}, - {"/gpx/metadata/link/type", {tt_link_type, false}}, - - {"/gpx/wpt", {tt_wpt, false}}, + {"/gpx", {tag_type::gpx, false}}, + METATAG(tag_type::name, "name"), + METATAG(tag_type::desc, "desc"), + {"/gpx/author", {tag_type::author, false}}, + {"/gpx/email", {tag_type::email, false}}, + {"/gpx/url", {tag_type::url, false}}, + {"/gpx/urlname", {tag_type::urlname, false}}, + METATAG(tag_type::keywords, "keywords"), + {"/gpx/metadata/link", {tag_type::link, false}}, + {"/gpx/metadata/link/text", {tag_type::link_text, false}}, + {"/gpx/metadata/link/type", {tag_type::link_type, false}}, + + {"/gpx/wpt", {tag_type::wpt, false}}, /* Double up the GPX 1.0 and GPX 1.1 styles */ // GEOTAG(tt_cache, "cache"), - {"/gpx/wpt/groundspeak:cache", {tt_cache, true}}, - - GEOTAG(tt_cache_name, "name"), - GEOTAG(tt_cache_container, "container"), - GEOTAG(tt_cache_type, "type"), - GEOTAG(tt_cache_difficulty, "difficulty"), - GEOTAG(tt_cache_terrain, "terrain"), - GEOTAG(tt_cache_hint, "encoded_hints"), - GEOTAG(tt_cache_hint, "hints"), /* opencaching.de */ - GEOTAG(tt_cache_desc_short, "short_description"), - GEOTAG(tt_cache_desc_long, "long_description"), - GEOTAG(tt_cache_placer, "owner"), - GEOTAG(tt_cache_favorite_points, "favorite_points"), - GEOTAG(tt_cache_personal_note, "personal_note"), - {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:log_wpt", {tt_cache_log_wpt, true}}, - {"/gpx/wpt/extensions/cache/logs/log/log_wpt", {tt_cache_log_wpt, true}}, - {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:type", {tt_cache_log_type, true}}, - {"/gpx/wpt/extensions/cache/logs/log/type", {tt_cache_log_type, true}}, - {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:date", {tt_cache_log_date, true}}, - {"/gpx/wpt/extensions/cache/logs/log/date", {tt_cache_log_date, true}}, - - {"/gpx/wpt/extensions", {tt_wpt_extensions, false}}, - - {GARMIN_WPT_EXT, {tt_garmin_wpt_extensions, false}}, - {GARMIN_WPT_EXT "/gpxx:Proximity", {tt_garmin_wpt_proximity, false}}, - {GARMIN_WPT_EXT "/gpxx:Temperature", {tt_garmin_wpt_temperature, false}}, - {GARMIN_TRKPT_EXT "/gpxtpx:atemp", {tt_garmin_wpt_temperature, true}}, - {GARMIN_WPT_EXT "/gpxx:Depth", {tt_garmin_wpt_depth, false}}, - {GARMIN_WPT_EXT "/gpxx:DisplayMode", {tt_garmin_wpt_display_mode, false}}, - {GARMIN_WPT_EXT "/gpxx:Categories", {tt_garmin_wpt_categories, false}}, - {GARMIN_WPT_EXT "/gpxx:Categories/gpxx:Category", {tt_garmin_wpt_category, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:StreetAddress", {tt_garmin_wpt_addr, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:City", {tt_garmin_wpt_city, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:State", {tt_garmin_wpt_state, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:Country", {tt_garmin_wpt_country, false}}, - {GARMIN_WPT_EXT "/gpxx:Address/gpxx:PostalCode", {tt_garmin_wpt_postal_code, false}}, - {GARMIN_WPT_EXT "/gpxx:PhoneNumber", {tt_garmin_wpt_phone_nr, false}}, + {"/gpx/wpt/groundspeak:cache", {tag_type::cache, true}}, + + GEOTAG(tag_type::cache_name, "name"), + GEOTAG(tag_type::cache_container, "container"), + GEOTAG(tag_type::cache_type, "type"), + GEOTAG(tag_type::cache_difficulty, "difficulty"), + GEOTAG(tag_type::cache_terrain, "terrain"), + GEOTAG(tag_type::cache_hint, "encoded_hints"), + GEOTAG(tag_type::cache_desc_short, "short_description"), + GEOTAG(tag_type::cache_desc_long, "long_description"), + GEOTAG(tag_type::cache_placer, "owner"), + GEOTAG(tag_type::cache_favorite_points, "favorite_points"), + GEOTAG(tag_type::cache_personal_note, "personal_note"), + {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:log_wpt", {tag_type::cache_log_wpt, true}}, + {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:type", {tag_type::cache_log_type, true}}, + {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:date", {tag_type::cache_log_date, true}}, + + {"/gpx/wpt/extensions", {tag_type::wpt_extensions, true}}, + + {GARMIN_WPT_EXT, {tag_type::garmin_wpt_extensions, true}}, + {GARMIN_WPT_EXT "/gpxx:Proximity", {tag_type::garmin_wpt_proximity, true}}, + {GARMIN_WPT_EXT "/gpxx:Temperature", {tag_type::garmin_wpt_temperature, true}}, + {GARMIN_TRKPT_EXT "/gpxtpx:atemp", {tag_type::garmin_wpt_temperature, true}}, + {GARMIN_WPT_EXT "/gpxx:Depth", {tag_type::garmin_wpt_depth, true}}, + {GARMIN_WPT_EXT "/gpxx:DisplayMode", {tag_type::garmin_wpt_display_mode, true}}, + {GARMIN_WPT_EXT "/gpxx:Categories", {tag_type::garmin_wpt_categories, true}}, + {GARMIN_WPT_EXT "/gpxx:Categories/gpxx:Category", {tag_type::garmin_wpt_category, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:StreetAddress", {tag_type::garmin_wpt_addr, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:City", {tag_type::garmin_wpt_city, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:State", {tag_type::garmin_wpt_state, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:Country", {tag_type::garmin_wpt_country, true}}, + {GARMIN_WPT_EXT "/gpxx:Address/gpxx:PostalCode", {tag_type::garmin_wpt_postal_code, true}}, + {GARMIN_WPT_EXT "/gpxx:PhoneNumber", {tag_type::garmin_wpt_phone_nr, true}}, // In Garmin space, but in core of waypoint. - {GARMIN_TRKPT_EXT "/gpxtpx:hr", {tt_trk_trkseg_trkpt_heartrate, true}}, - {GARMIN_TRKPT_EXT "/gpxtpx:cad", {tt_trk_trkseg_trkpt_cadence, true}}, - - {"/gpx/wpt/extensions/h:depth", {tt_humminbird_wpt_depth, false}}, // in centimeters. - {"/gpx/wpt/extensions/h:status", {tt_humminbird_wpt_status, false}}, - - {"/gpx/rte", {tt_rte, false}}, - {"/gpx/rte/name", {tt_rte_name, false}}, - {"/gpx/rte/desc", {tt_rte_desc, false}}, - {"/gpx/rte/url", {tt_rte_url, false}}, /* GPX 1.0 */ - {"/gpx/rte/urlname", {tt_rte_urlname, false}}, /* GPX 1.0 */ - {"/gpx/rte/link", {tt_rte_link, false}}, /* GPX 1.1 */ - {"/gpx/rte/link/text", {tt_rte_link_text, false}}, /* GPX 1.1 */ - {"/gpx/rte/link/type", {tt_rte_link_type, false}}, /* GPX 1.1 */ - {"/gpx/rte/number", {tt_rte_number, false}}, - {GARMIN_RTE_EXT "/gpxx:DisplayColor", {tt_garmin_rte_display_color, true}}, - - {"/gpx/rte/rtept", {tt_rte_rtept, false}}, - - {"/gpx/trk", {tt_trk, false}}, - {"/gpx/trk/name", {tt_trk_name, false}}, - {"/gpx/trk/desc", {tt_trk_desc, false}}, - {"/gpx/trk/trkseg", {tt_trk_trkseg, false}}, - {"/gpx/trk/url", {tt_trk_url, false}}, /* GPX 1.0 */ - {"/gpx/trk/urlname", {tt_trk_urlname, false}}, /* GPX 1.0 */ - {"/gpx/trk/link", {tt_trk_link, false}}, /* GPX 1.1 */ - {"/gpx/trk/link/text", {tt_trk_link_text, false}}, /* GPX 1.1 */ - {"/gpx/trk/link/type", {tt_trk_link_type, false}}, /* GPX 1.1 */ - {"/gpx/trk/number", {tt_trk_number, false}}, - {GARMIN_TRK_EXT "/gpxx:DisplayColor", {tt_garmin_trk_display_color, true}}, - - {"/gpx/trk/trkseg/trkpt", {tt_trk_trkseg_trkpt, false}}, - {"/gpx/trk/trkseg/trkpt/course", {tt_trk_trkseg_trkpt_course, false}}, - {"/gpx/trk/trkseg/trkpt/speed", {tt_trk_trkseg_trkpt_speed, false}}, - - {"/gpx/trk/trkseg/trkpt/extensions/h:depth", {tt_humminbird_trk_trkseg_trkpt_depth, false}}, // in centimeters. + {GARMIN_TRKPT_EXT "/gpxtpx:hr", {tag_type::trk_trkseg_trkpt_heartrate, true}}, + {GARMIN_TRKPT_EXT "/gpxtpx:cad", {tag_type::trk_trkseg_trkpt_cadence, true}}, + + {"/gpx/wpt/extensions/h:depth", {tag_type::humminbird_wpt_depth, true}}, // in centimeters. + {"/gpx/wpt/extensions/h:status", {tag_type::humminbird_wpt_status, true}}, + + {"/gpx/rte", {tag_type::rte, false}}, + {"/gpx/rte/name", {tag_type::rte_name, false}}, + {"/gpx/rte/desc", {tag_type::rte_desc, false}}, + {"/gpx/rte/url", {tag_type::rte_url, false}}, /* GPX 1.0 */ + {"/gpx/rte/urlname", {tag_type::rte_urlname, false}}, /* GPX 1.0 */ + {"/gpx/rte/link", {tag_type::rte_link, false}}, /* GPX 1.1 */ + {"/gpx/rte/link/text", {tag_type::rte_link_text, false}}, /* GPX 1.1 */ + {"/gpx/rte/link/type", {tag_type::rte_link_type, false}}, /* GPX 1.1 */ + {"/gpx/rte/number", {tag_type::rte_number, false}}, + {GARMIN_RTE_EXT "/gpxx:DisplayColor", {tag_type::garmin_rte_display_color, true}}, + + {"/gpx/rte/rtept", {tag_type::rte_rtept, false}}, + + {"/gpx/trk", {tag_type::trk, false}}, + {"/gpx/trk/name", {tag_type::trk_name, false}}, + {"/gpx/trk/desc", {tag_type::trk_desc, false}}, + {"/gpx/trk/trkseg", {tag_type::trk_trkseg, false}}, + {"/gpx/trk/url", {tag_type::trk_url, false}}, /* GPX 1.0 */ + {"/gpx/trk/urlname", {tag_type::trk_urlname, false}}, /* GPX 1.0 */ + {"/gpx/trk/link", {tag_type::trk_link, false}}, /* GPX 1.1 */ + {"/gpx/trk/link/text", {tag_type::trk_link_text, false}}, /* GPX 1.1 */ + {"/gpx/trk/link/type", {tag_type::trk_link_type, false}}, /* GPX 1.1 */ + {"/gpx/trk/number", {tag_type::trk_number, false}}, + {GARMIN_TRK_EXT "/gpxx:DisplayColor", {tag_type::garmin_trk_display_color, true}}, + + {"/gpx/trk/trkseg/trkpt", {tag_type::trk_trkseg_trkpt, false}}, + {"/gpx/trk/trkseg/trkpt/course", {tag_type::trk_trkseg_trkpt_course, false}}, + {"/gpx/trk/trkseg/trkpt/speed", {tag_type::trk_trkseg_trkpt_speed, false}}, + + {"/gpx/trk/trkseg/trkpt/extensions/h:depth", {tag_type::humminbird_trk_trkseg_trkpt_depth, true}}, // in centimeters. /* Common to tracks, routes, and waypts */ - GPXWPTTYPETAG("ele", tt_wpttype_ele, false), - GPXWPTTYPETAG("time", tt_wpttype_time, false), - GPXWPTTYPETAG("geoidheight", tt_wpttype_geoidheight, false), - GPXWPTTYPETAG("name", tt_wpttype_name, false), - GPXWPTTYPETAG("cmt", tt_wpttype_cmt, false), - GPXWPTTYPETAG("desc", tt_wpttype_desc, false), - GPXWPTTYPETAG("url", tt_wpttype_url, false), /* GPX 1.0 */ - GPXWPTTYPETAG("urlname", tt_wpttype_urlname, false), /* GPX 1.0 */ - GPXWPTTYPETAG("link", tt_wpttype_link, false), /* GPX 1.1 */ - GPXWPTTYPETAG("link/text", tt_wpttype_link_text, false), /* GPX 1.1 */ - GPXWPTTYPETAG("link/type", tt_wpttype_link_type, false), /* GPX 1.1 */ - GPXWPTTYPETAG("sym", tt_wpttype_sym, false), - GPXWPTTYPETAG("type", tt_wpttype_type, true), - GPXWPTTYPETAG("fix", tt_wpttype_fix, false), - GPXWPTTYPETAG("sat", tt_wpttype_sat, false), - GPXWPTTYPETAG("hdop", tt_wpttype_hdop, false), - GPXWPTTYPETAG("vdop", tt_wpttype_vdop, false), - GPXWPTTYPETAG("pdop", tt_wpttype_pdop, false), + GPXWPTTYPETAG("ele", tag_type::wpttype_ele, false), + GPXWPTTYPETAG("time", tag_type::wpttype_time, false), + GPXWPTTYPETAG("magvar", tag_type::wpttype_magvar, false), + GPXWPTTYPETAG("geoidheight", tag_type::wpttype_geoidheight, false), + GPXWPTTYPETAG("name", tag_type::wpttype_name, false), + GPXWPTTYPETAG("cmt", tag_type::wpttype_cmt, false), + GPXWPTTYPETAG("desc", tag_type::wpttype_desc, false), + GPXWPTTYPETAG("src", tag_type::wpttype_src, false), + GPXWPTTYPETAG("url", tag_type::wpttype_url, false), /* GPX 1.0 */ + GPXWPTTYPETAG("urlname", tag_type::wpttype_urlname, false), /* GPX 1.0 */ + GPXWPTTYPETAG("link", tag_type::wpttype_link, false), /* GPX 1.1 */ + GPXWPTTYPETAG("link/text", tag_type::wpttype_link_text, false), /* GPX 1.1 */ + GPXWPTTYPETAG("link/type", tag_type::wpttype_link_type, false), /* GPX 1.1 */ + GPXWPTTYPETAG("sym", tag_type::wpttype_sym, false), + GPXWPTTYPETAG("type", tag_type::wpttype_type, false), + GPXWPTTYPETAG("fix", tag_type::wpttype_fix, false), + GPXWPTTYPETAG("sat", tag_type::wpttype_sat, false), + GPXWPTTYPETAG("hdop", tag_type::wpttype_hdop, false), + GPXWPTTYPETAG("vdop", tag_type::wpttype_vdop, false), + GPXWPTTYPETAG("pdop", tag_type::wpttype_pdop, false), + GPXWPTTYPETAG("ageofdgpsdata", tag_type::wpttype_ageofdgpsdata, false), + GPXWPTTYPETAG("dgpsid", tag_type::wpttype_dgpsid, false), }; QVector gpx_args = { diff --git a/grtcirc.cc b/grtcirc.cc index 52a002cf4..bb4345ff0 100644 --- a/grtcirc.cc +++ b/grtcirc.cc @@ -19,14 +19,15 @@ */ -#include "defs.h" #include "grtcirc.h" -#include -#include -#include -#include -#include +#include // for clamp +#include // for errno, EDOM +#include // for cos, sin, fabs, atan2, sqrt, asin, atan, isnan +#include // for pi +#include // for tie, tuple, make_tuple, ignore + +#include "defs.h" // for PositionRad, DEG, METERS_TO_MILES, PositionDeg static constexpr double EARTH_RAD = 6378137.0; @@ -45,20 +46,9 @@ static double dotproduct(double x1, double y1, double z1, return (x1 * x2 + y1 * y2 + z1 * z2); } -/* - * Note: this conversion to miles uses the WGS84 value for the radius of - * the earth at the equator. - * (radius in meters)*(100cm/m) -> (radius in cm) - * (radius in cm) / (2.54 cm/in) -> (radius in in) - * (radius in in) / (12 in/ft) -> (radius in ft) - * (radius in ft) / (5280 ft/mi) -> (radius in mi) - * If the compiler is half-decent, it'll do all the math for us at compile - * time, so why not leave the expression human-readable? - */ - double radtomiles(double rads) { - const double radmiles = METERS_TO_MILES(EARTH_RAD); + constexpr double radmiles = METERS_TO_MILES(EARTH_RAD); return (rads * radmiles); } @@ -67,20 +57,21 @@ double radtometers(double rads) return (rads * EARTH_RAD); } -double gcdist(double lat1, double lon1, double lat2, double lon2) +double gcdist(PositionRad pos1, PositionRad pos2) { errno = 0; + const double lat1 = pos1.latR; + const double lon1 = pos1.lonR; + const double lat2 = pos2.latR; + const double lon2 = pos2.lonR; + double sdlat = sin((lat1 - lat2) / 2.0); double sdlon = sin((lon1 - lon2) / 2.0); double res = sqrt(sdlat * sdlat + cos(lat1) * cos(lat2) * sdlon * sdlon); - if (res > 1.0) { - res = 1.0; - } else if (res < -1.0) { - res = -1.0; - } + res = std::clamp(res, -1.0, 1.0); res = asin(res); @@ -95,10 +86,15 @@ double gcdist(double lat1, double lon1, double lat2, double lon2) /* This value is the heading you'd leave point 1 at to arrive at point 2. * Inputs and outputs are in radians. */ -double heading(double lat1, double lon1, double lat2, double lon2) +static double heading(PositionRad pos1, PositionRad pos2) { - double v1 = sin(lon1 - lon2) * cos(lat2); - double v2 = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon1 - lon2); + const double lat1 = pos1.latR; + const double lon1 = pos1.lonR; + const double lat2 = pos2.latR; + const double lon2 = pos2.lonR; + + double v1 = sin(lon2 - lon1) * cos(lat2); + double v2 = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1); /* rounding error protection */ if (fabs(v1) < 1e-15) { v1 = 0.0; @@ -109,10 +105,9 @@ double heading(double lat1, double lon1, double lat2, double lon2) return atan2(v1, v2); } -/* As above, but outputs is in degrees from 0 - 359. Inputs are still radians. */ -double heading_true_degrees(double lat1, double lon1, double lat2, double lon2) +double heading_true_degrees(PositionRad pos1, PositionRad pos2) { - double h = 360.0 - DEG(heading(lat1, lon1, lat2, lon2)); + double h = 360.0 + DEG(heading(pos1, pos2)); if (h >= 360.0) { h -= 360.0; } @@ -123,38 +118,48 @@ double heading_true_degrees(double lat1, double lon1, double lat2, double lon2) // Note: This is probably not going to vectorize as it uses statics internally, // so it's hard for the optimizer to prove it's a pure function with no side // effects, right? -double linedistprj(double lat1, double lon1, - double lat2, double lon2, - double lat3, double lon3, - double* prjlat, double* prjlon, - double* frac) +std::tuple linedistprj(PositionRad pos1, + PositionRad pos2, + PositionRad pos3) { static double _lat1 = -9999; static double _lat2 = -9999; static double _lon1 = -9999; static double _lon2 = -9999; - static double x1, y1, z1; - static double x2, y2, z2; - static double xa, ya, za, la; + static double x1; + static double y1; + static double z1; + static double x2; + static double y2; + static double z2; + static double xa; + static double ya; + static double za; + static double la; double dot; - *prjlat = lat1; - *prjlon = lon1; - *frac = 0; + /* prjpos must be of type PositionRad as we assign + * prjpos.lat, prjpos.lon below in radians. + */ + PositionRad prjpos = pos1; - /* degrees to radians */ - lat1 = RAD(lat1); - lon1 = RAD(lon1); - lat2 = RAD(lat2); - lon2 = RAD(lon2); - lat3 = RAD(lat3); - lon3 = RAD(lon3); + double frac = 0; - int newpoints = 1; + /* we use these values below assuming they are in radians, + * => posn must be of type PositionRad. + */ + const double lat1 = pos1.latR; + const double lon1 = pos1.lonR; + const double lat2 = pos2.latR; + const double lon2 = pos2.lonR; + const double lat3 = pos3.latR; + const double lon3 = pos3.lonR; + + bool newpoints = true; if (lat1 == _lat1 && lat2 == _lat2 && lon1 == _lon1 && lon2 == _lon2) { - newpoints = 0; + newpoints = false; } else { _lat1 = lat1; _lat2 = lat2; @@ -179,10 +184,7 @@ double linedistprj(double lat1, double lon1, /* 'a' is the axis; the line that passes through the center of the earth * and is perpendicular to the great circle through point 1 and point 2 * It is computed by taking the cross product of the '1' and '2' vectors.*/ - auto [xt, yt, zt] = crossproduct(x1, y1, z1, x2, y2, z2); - xa = xt; - ya = yt; - za = zt; + std::tie(xa, ya, za) = crossproduct(x1, y1, z1, x2, y2, z2); la = sqrt(xa * xa + ya * ya + za * za); if (la) { @@ -226,15 +228,15 @@ double linedistprj(double lat1, double lon1, * atan2 would be overkill because lp and fabs(dot) are both * known to be positive. */ - *prjlat = DEG(asin(yp)); + prjpos.latR = asin(yp); if (xp == 0 && zp == 0) { - *prjlon = 0; + prjpos.lonR = 0; } else { - *prjlon = DEG(atan2(zp, xp)); + prjpos.lonR = atan2(zp, xp); } - *frac = d1 / (d1 + d2); + frac = d1 / (d1 + d2); - return atan(fabs(dot) / lp); + return {atan(fabs(dot) / lp), prjpos , frac}; } /* otherwise, get the distance from the closest endpoint */ @@ -260,34 +262,32 @@ double linedistprj(double lat1, double lon1, } if (fabs(d1) < fabs(d2)) { - return gcdist(lat1, lon1, lat3, lon3); + return {gcdist(pos1, pos3), prjpos, frac}; } else { - *prjlat = DEG(lat2); - *prjlon = DEG(lon2); - *frac = 1.0; - return gcdist(lat2, lon2, lat3, lon3); + prjpos = pos2; + frac = 1.0; + return {gcdist(pos2, pos3), prjpos, frac}; } } else { /* lp is 0 when 3 is 90 degrees from the great circle */ - return M_PI / 2; + return {std::numbers::pi / 2, prjpos, frac}; } } else { /* la is 0 when 1 and 2 are either the same point or 180 degrees apart */ dot = dotproduct(x1, y1, z1, x2, y2, z2); if (dot >= 0) { - return gcdist(lat1, lon1, lat3, lon3); + return {gcdist(pos1, pos3), prjpos, frac}; } else { - return 0; + return {0, prjpos, frac}; } } } -double linedist(double lat1, double lon1, - double lat2, double lon2, - double lat3, double lon3) +double linedist(PositionRad pos1, PositionRad pos2, PositionRad pos3) { - double dummy; - return linedistprj(lat1, lon1, lat2, lon2, lat3, lon3, &dummy, &dummy, &dummy); + double dist; + std::tie(dist, std::ignore, std::ignore) = linedistprj(pos1, pos2, pos3); + return dist; } /* @@ -297,20 +297,20 @@ double linedist(double lat1, double lon1, * Ref: http://mathworld.wolfram.com/RotationFormula.html */ -void linepart(double lat1, double lon1, - double lat2, double lon2, - double frac, - double* reslat, double* reslon) +PositionDeg linepart(PositionRad pos1, PositionRad pos2, double frac) { - /* result must be in degrees */ - *reslat = lat1; - *reslon = lon1; - - /* degrees to radians */ - lat1 = RAD(lat1); - lon1 = RAD(lon1); - lat2 = RAD(lat2); - lon2 = RAD(lon2); + /* respos must be of type PositionRad as we assign + * respos.lat, respos.lon below in radians. + */ + PositionRad respos = pos1; + + /* we use these values below assuming they are in radians, + * => posn must be of type PositionRad. + */ + const double lat1 = pos1.latR; + const double lon1 = pos1.lonR; + const double lat2 = pos2.latR; + const double lon2 = pos2.lonR; /* polar to ECEF rectangular */ double x1 = cos(lon1) * cos(lat1); @@ -353,11 +353,12 @@ void linepart(double lat1, double lon1, yr = std::clamp(yr, -1.0, 1.0); zr = std::clamp(zr, -1.0, 1.0); - *reslat = DEG(asin(yr)); + respos.latR = asin(yr); if (xr == 0 && zr == 0) { - *reslon = 0; + respos.lonR = 0; } else { - *reslon = DEG(atan2(zr, xr)); + respos.lonR = atan2(zr, xr); } } + return respos; } diff --git a/grtcirc.h b/grtcirc.h index 70641f183..9d8900dd0 100644 --- a/grtcirc.h +++ b/grtcirc.h @@ -22,34 +22,24 @@ #ifndef GRTCIRC_H #define GRTCIRC_H -double gcdist(double lat1, double lon1, double lat2, double lon2); -double heading(double lat1, double lon1, double lat2, double lon2); -double heading_true_degrees(double lat1, double lon1, double lat2, double lon2); +#include // for tuple +#include "defs.h" // for PositionRad, PositionDeg -double linedistprj(double lat1, double lon1, - double lat2, double lon2, - double lat3, double lon3, - double* prjlat, double* prjlon, - double* frac); - -double linedist(double lat1, double lon1, - double lat2, double lon2, - double lat3, double lon3); +/* Note PositionDeg and PositionRad can be implicity converted to + * each other, so you may use either to interface to these functions. + */ -double radtometers(double rads); -double radtomiles(double rads); +double gcdist(PositionRad pos1, PositionRad pos2); +double heading_true_degrees(PositionRad pos1, PositionRad pos2); -void linepart(double lat1, double lon1, - double lat2, double lon2, - double frac, - double* reslat, double* reslon); +std::tuple linedistprj(PositionRad pos1, + PositionRad pos2, + PositionRad pos3); -/* Degrees to radians */ -constexpr double kDegreesPerRadian = 180.0 / M_PI; -constexpr double DEG(double x) { return x * kDegreesPerRadian; } +double linedist(PositionRad pos1, PositionRad pos2, PositionRad pos3); -/* Radians to degrees */ -constexpr double kRadiansPerDegree = 1.0 / kDegreesPerRadian; -constexpr double RAD(double x) { return x * kRadiansPerDegree; } +double radtometers(double rads); +double radtomiles(double rads); +PositionDeg linepart(PositionRad pos1, PositionRad pos2, double frac); #endif diff --git a/gtm.cc b/gtm.cc index d2bf5fbfe..cb309c506 100644 --- a/gtm.cc +++ b/gtm.cc @@ -24,30 +24,20 @@ * https://www.trackmaker.com/download/GTM211_format.pdf */ +#include "gtm.h" + #include // for SEEK_CUR #include // for strlen, memset #include // for QList #include // for QString -#include // for QVector -#include "defs.h" -#include "gbfile.h" // for gbfseek, gbfputc, gbfputint32, gbfputflt +#include "defs.h" +#include "gbfile.h" // for gbfseek, gbfputc, gbfputint32, gbfputflt, gbfputint16, gbfputuint16, gbfgetint32, gbfgetdbl, gbfputdbl, gbfgetint16, gbfwrite, gbfgetflt, gbfile, gbfclose, gbfgetc, gbfopen_le, gbfreadbuf #include "jeeps/gpsmath.h" // for GPS_Math_Known_Datum_To_WGS84_M #include "src/core/datetime.h" // for DateTime -static gbfile* file_in, *file_out; -static int indatum; -static int wp_count; -static int ws_count; -static int tr_count; -static int ts_count; -static int rt_count; -static int im_count; -static const route_head* rte_active; -static int start_new; - #define MYNAME "GTM" #define EPOCH89DIFF 631065600 /* was 631076400 but that seems to include a three-hour bias */ @@ -70,8 +60,8 @@ static int start_new; #if 0 /* not used */ -static short int -fread_bool(gbfile* fd) +short int +GtmFormat::fread_bool(gbfile* fd) { char buf[2]; gbfread(buf, 2, 1, fd); @@ -84,29 +74,29 @@ fread_bool(gbfile* fd) #define fread_single(a) gbfgetflt(a) #define fread_double(a) gbfgetdbl(a) -static QString -fread_string(gbfile* fd) +QString +GtmFormat::fread_string(gbfile* fd) { int len = fread_integer(fd); return gbfreadbuf(len, fd); } -static void -fread_string_discard(gbfile* fd) +void +GtmFormat::fread_string_discard(gbfile* fd) { fread_string(fd); } -static QString -fread_fixedstring(gbfile* fd, int len) +QString +GtmFormat::fread_fixedstring(gbfile* fd, int len) { return gbfreadbuf(len, fd); } /* Write functions, according to specification. */ -static void -fwrite_null(gbfile* fd, int len) +void +GtmFormat::fwrite_null(gbfile* fd, int len) { char buf[1024]; @@ -121,8 +111,8 @@ fwrite_null(gbfile* fd, int len) #define fwrite_single(a,b) gbfputflt((b), a) #define fwrite_double(a,b) gbfputdbl((b), a) -static void -fwrite_string(gbfile* fd, const char* str) +void +GtmFormat::fwrite_string(gbfile* fd, const char* str) { if (str && str[0]) { int len = strlen(str); @@ -132,8 +122,9 @@ fwrite_string(gbfile* fd, const char* str) fwrite_integer(fd, 0); } } -static void -fwrite_string(gbfile* fd, const QString& str) + +void +GtmFormat::fwrite_string(gbfile* fd, const QString& str) { if (str.isEmpty()) { fwrite_integer(fd, 0); @@ -143,8 +134,8 @@ fwrite_string(gbfile* fd, const QString& str) } } -static void -fwrite_fixedstring(gbfile* fd, const char* str, int fieldlen) +void +GtmFormat::fwrite_fixedstring(gbfile* fd, const char* str, int fieldlen) { int len = str ? strlen(str) : 0; @@ -159,159 +150,15 @@ fwrite_fixedstring(gbfile* fd, const char* str, int fieldlen) } } -static void -fwrite_fixedstring(gbfile* fd, const QString& str, int fieldlen) +void +GtmFormat::fwrite_fixedstring(gbfile* fd, const QString& str, int fieldlen) { fwrite_fixedstring(fd, CSTR(str), fieldlen); } /* Auxiliary functions */ -#define MAX_INDATUM_INDEX 263 - -static const int indatum_array[MAX_INDATUM_INDEX] = { - -1, // < 1 - 0, 0, 0, 0, 0, 0, 0, // < 8 : Adindan - 1, // < 9 : Afgooye - 2, // < 10 : Ain el Abd - -1, -1, -1, -1, // < 14 - 6, 6, 6, 6, 6, 6, 6, 6, 6, // < 23 : ARC 1950 - 7, 7, 7, // < 26 : ARC 1960 - 8, // < 27 : Ascension Island 58 - -1, -1, -1, -1, -1, // < 32 - 13, // < 33 : Australian Geo 84 - -1, // < 34 - 15, // < 35 : Bellevue IGN - 16, // < 36 : Bermuda 1957 - -1, -1, // < 38 - 17, // < 39 : Bukit Rimpah - 18, // < 40 : Camp Area Astro - 19, // < 41 : Campo Inchauspe - 22, // < 42 : Canton Islan 1966 - 23, // < 43 : Cape - 24, // < 44 : Cape Canaveral - 26, // < 45 : Carthe - 28, // < 46 : Chatham - 29, // < 47 : Chua Astro - 30, // < 48 : Corrego Alegre - -1, -1, // < 50 - 33, // < 51 : Djakarta (Batavia) - 34, // < 52 : DOS 1968 - 35, // < 53 : Easter Island 1967 - -1, // < 54 - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, // < 69 : European 1950 Mean - 39, // < 70 : European 1979 Mean - -1, // < 71 - 41, // < 72 : Gandajika - 42, // < 73 : Geodetic Datum 49 - -1, // < 74 - 45, // < 75 : Guam 1963 - 46, // < 76 : Gunung Segara - -1, // < 77 - 49, // < 78 : Hearth North - -1, // < 79 - 50, // < 80 : Hjorsey 1955 - 51, // < 81 : Hong Kong 1963 - 52, // < 82 : Hu-Tzu-Shan - 53, 53, 53, 53, 53, 53, 53, // < 89 : Indian - -1, // < 90 - 55, // < 91 : Ireland 1965 - -1, // < 92 - 56, // < 93 : ISTS 073 69 - 57, // < 94 : Johnston Island 61 - 58, // < 95 : Kandawala - 59, // < 96 : Kerguelen Island - 60, // < 97 : Kertau 48 - -1, -1, // < 99 - 61, // < 100 : L.C. 5 Astro - -1, // < 101 - 63, // < 102 : Liberia 1964 - 64, 64, // < 104 : Luzon - -1, // < 105 - 65, // < 106 : Mahe 1971 - -1, // < 107 - 69, // < 108 : Merchich - 71, // < 109 : Midway Astro 61 - 73, 73, // < 111 : Minna - -1, // < 112 - 75, 75, 75, // < 115 : Nahrwan - 76, // < 116 : Naparima BWI - 3, 3, 3, // < 119 : Alaska NAD27 - 14, 14, // < 121 : Bahamas NAD27 - 20, 20, 20, 20, 20, // < 126 : Canada Mean NAD27 - 21, // < 127 : Canal Zone NAD27 - 31, // < 128 : Cuba NAD27 - 44, // < 129 : Greenland NAD27 - -1, -1, // < 131 - 20, // < 132 : Canada Mean NAD27 - -1, -1, -1, // < 135 - 70, // < 136 : Mexico NAD27 - -1, -1, -1, -1, -1, -1, -1, -1, // < 144 - 80, // < 145 : Old Egyptian - 81, // < 146 : Old Hawaiian - 82, // < 147 : Old Hawaiian Kauai - 83, // < 148 : Old Hawaiian Maui - 81, // < 149 : Old Hawaiian Mean - 84, // < 150 : Old Hawaiian Oahu - 85, // < 151 : Oman - 86, 86, 86, 86, 86, // < 156 : OSG Britain - 87, // < 157 : Pico de Las Nieves - 88, // < 158 : Pitcairn Astro 67 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // < 171 - 91, // < 172 : Puerto Rico - 92, // < 173 : Pulkovo 1942 - 94, // < 174 : Quatar National - -1, -1, // < 176 - 95, // < 177 : Rome 1940 - 96, 96, 96, 96, 96, 96, 96, // < 184 : S-42 (Pulkovo 1942) - -1, // < 185 - 100, // < 186 : Santo DOS - 99, // < 187 : Sao Braz - -1, -1, -1, -1, // < 191 - 105, 105, // < 193 : SAD-69/Mean - 98, // < 194 : SAD-69/Brazil - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, // < 204 : SAD-69/Mean - 106, // < 205 : South Asia - 109, // < 206 : Tananarive 1926 - 111, // < 207 : Timbalai 1948 - 112, 112, 112, 112, // < 211 : Tokyo mean - 113, // < 212 : Tristan Astro 1968 - 115, // < 213 : Viti Levu 1916 - -1, -1, // < 215 - 116, // < 216 : Wake Eniwetok 1960 - 117, // < 217 : WGS 72 - 118, // < 218 : WGS 84 - 119, // < 219 : Yacare - 120, // < 220 : Zanderij - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // < 231 - 98, // < 232 : SAD-69/Brazil - -1, -1, // < 234 - 117, // < 235 : WGS 72 - 0, // < 236 : Adindan - 2, // < 237 : Ain el Abd - 7, // < 238 : ARC 1960 - 8, // < 239 : Ascension Island 58 - -1, -1, // < 241 - 52, // < 242 : Hu-Tzu-Shan - 53, 53, 53, // < 245 : Indian - -1, // < 246 - 57, // < 247 : Johnston Island 61 - 64, // < 248 : Luzon - -1, // < 249 - 75, // < 250 : Nahrwan - 76, // < 251 : Naparima BWI - -1, -1, -1, // < 254 - 82, // < 255 : Old Hawaiian Kauai - 83, // < 256 : Old Hawaiian Maui - 84, // < 257 : Old Hawaiian Oahu - -1, -1, // < 259 - 101, // < 260 : Sapper Hill 43 - 111, // < 261 : Timbalai 1948 - 112, // < 262 : Tokyo mean - 116 // < 263 : Wake Eniwetok 1960 -}; - -static void set_datum(int n) +void GtmFormat::set_datum(int n) { indatum = -1; if (n > 0 && n < MAX_INDATUM_INDEX) { @@ -323,52 +170,7 @@ static void set_datum(int n) } } -static const char* icon_descr[] = { - "", "Airport", "Ball Park", "Bank", "Bar", "Boat Ramp", "Campground", "Car", - "City (Large)", "City (Medium)", "City (Small)", "Dam", "Danger Area", - "Drinking Water", "Fishing Area", "Gas Station", "Glider Area", "Golf Course", - "Heliport", "Hotel", "Animals", "Information", "Man Overboard", "Marina", - "Mine", "Medical Facility", "Parachute Area", "Park", "Parking Area", - "Picnic Area", "Private Field", "Residence", "Restaurant", "Restroom", - "Scenic Area", "School", "Seaplane Base", "Shipwreck", "Shopping Center", - "Short Tower", "Policy Station", "Ski Resort", "Soft Field", "Swimming Area", - "Tall Tower", "Telephone", "Tracback Point", "Ultralight Area", "Waypoint", - "Boat", "Exit", "Flag", "Duck", "Buoy", "Back Track", "Beach", "Bridge", - "Building", "Car Repair", "Cemetery", "Church", "Civil", "Convenience Store", - "Crossing", "Fast Food", "Forest", "Ghost Town", "Levee", "Military", - "Oil Field", "Post Office", "Rv Park", "Scales", "Summit", "Toll Booth", - "Trail Head", "Truck Stop", "Tunnel", "Highway", "Gate", "Fall", "Fence", - "Mata-Burro", "Fitness Center", "Movie Theater", "Live Theater", "Zoo", "Horn", - "Bowling", "Car Rental", "City (Capitol)", "Controlled Area", "Stadium", - "Museum", "Amusement Park", "Skull", "Department Store", "Pharmacy", "Pizza", - "Diver Down Flag 1", "Light", "Pin", "", "Pigsty", "Tree", "Bamboo", - "Banana Plant", "Arrow-Down", "Bifurcation", "Cavern", "River", "Rock", - "Arrow-Up", "Trunk", "Soccer Field", "Sporting Court", "Flag, Green", "Trench", - "Ship-Yellow", "Green Sign", "Swamp", "Lake", "Stop!", - "Fishing Hot Spot Facility", "Speed Reducer", "Stairway", "Cactus", "Ship-Red", - "Letter - S", "Letter - D", "Letter - N", - "Crossing", "Cross", "Flag, Red", "Curve1", "Curve2", "Curve3", "Curve4", - "Letter - W", "Letter - L", "Letter - R", "Radio Beacon", "Road Sign", - "Geocache", "Geocache Found", "Traffic Light", "Bus Station", "Train Station", - "School", "Mile Marker", "Conservation Area", "Waypoint", "Box", "Aerial", - "Auto Repair", "Boat", "Exit Ramp", "Fixed Nav Aid", "Floating Buoy", "Garden", - "Fish Farm", "Lighthouse", "Truck Service", "Resort", "Scuba", "Shooting", - "Sight Seeing", "Sounding", "Winery", "Navaid, Amber", "Navaid, Black", - "Navaid, Blue", "Navaid, Green", "Navaid, Green/Red", "Navaid, Green/White", - "Navaid, Orange", "Navaid, Red", "Navaid, Red/Green", "Navaid, Red/White", - "Navaid, Violet", "Navaid, White", "Navaid, White/Green", "Navaid, White/Red", - "Buoy, White", "Dot, White", "Red Square", "Red Diamond", "Green Square", - "Green Diamond", "Restricted Area", "Navaid (unlit)", "Dot (Small)", "Libraries", "Waypoint", "Waypoint1", - "Waypoint2", "Mark (1)", "Mark (2)", "Mark (3)", "Cross (Red)", "Store", - "Exclamation", "Flag (EUA)", "Flag (CAN)", "Flag (BRA)", "Man", "Animals", - "Deer Tracks", "Tree Stand", "Bridge", "Fence", "Intersection", - "Non Direct Beacon", "VHF Omni Range", "Vor/Tacan", "Vor-Dme", - "1st Approach Fix", "Localizer Outer", "Missed Appr. Pt", "Tacan", - "CheckPoint", nullptr -}; - - -static void convert_datum(double* lat, double* lon) +void GtmFormat::convert_datum(double* lat, double* lon) const { double amt; if (indatum != -1 && indatum != 118) { @@ -379,8 +181,8 @@ static void convert_datum(double* lat, double* lon) /* Callbacks */ -static void -gtm_rd_init(const QString& fname) +void +GtmFormat::rd_init(const QString& fname) { file_in = gbfopen_le(fname, "rb", MYNAME); int version = fread_integer(file_in); @@ -417,21 +219,21 @@ gtm_rd_init(const QString& fname) fread_discard(file_in, 22); } -static void -gtm_rd_deinit() +void +GtmFormat::rd_deinit() { gbfclose(file_in); } -static void count_track_styles(const route_head* rte) +void GtmFormat::count_track_styles(const route_head* rte) { if (!rte->rte_waypt_empty()) { ts_count++; } } -static void -gtm_wr_init(const QString& fname) +void +GtmFormat::wr_init(const QString& fname) { // Count the number of track style entires. // We don't output a track style for any track that doesn't have any @@ -440,7 +242,10 @@ gtm_wr_init(const QString& fname) // in this format as every tracklog entry represents a waypoint, // and a new track is defined by a tracklog entry with the tracklog flag set. ts_count = 0; - track_disp_all(count_track_styles, nullptr, nullptr); + auto count_track_styles_lambda = [this](const route_head* rte)->void { + count_track_styles(rte); + }; + track_disp_all(count_track_styles_lambda, nullptr, nullptr); file_out = gbfopen_le(fname, "wb", MYNAME); /* little endian */ @@ -490,14 +295,14 @@ gtm_wr_init(const QString& fname) fwrite_null(file_out, 22); } -static void -gtm_wr_deinit() +void +GtmFormat::wr_deinit() { gbfclose(file_out); } -static void -gtm_read() +void +GtmFormat::read() { route_head* trk_head = nullptr; route_head* rte_head = nullptr; @@ -625,7 +430,7 @@ gtm_read() } } -static int icon_from_descr(const QString& descr) +int GtmFormat::icon_from_descr(const QString& descr) { for (int i = 0; icon_descr[i]; i++) { if (descr.compare(icon_descr[i]) == 0) { @@ -635,7 +440,7 @@ static int icon_from_descr(const QString& descr) return 48; } -static void write_waypt(const Waypoint* wpt) +void GtmFormat::write_waypt(const Waypoint* wpt) { fwrite_double(file_out, wpt->latitude); fwrite_double(file_out, wpt->longitude); @@ -657,13 +462,13 @@ static void write_waypt(const Waypoint* wpt) fwrite_integer(file_out, 0); } -static void start_rte(const route_head* rte) +void GtmFormat::start_rte(const route_head* rte) { rte_active = rte; start_new = 1; } -static void write_trk_waypt(const Waypoint* wpt) +void GtmFormat::write_trk_waypt(const Waypoint* wpt) { fwrite_double(file_out, wpt->latitude); fwrite_double(file_out, wpt->longitude); @@ -677,7 +482,7 @@ static void write_trk_waypt(const Waypoint* wpt) start_new = 0; } -static void write_trk_style(const route_head* trk) +void GtmFormat::write_trk_style(const route_head* trk) { if (!trk->rte_waypt_empty()) { fwrite_string(file_out, trk->rte_name); @@ -689,7 +494,7 @@ static void write_trk_style(const route_head* trk) } } -static void write_rte_waypt(const Waypoint* wpt) +void GtmFormat::write_rte_waypt(const Waypoint* wpt) { fwrite_double(file_out, wpt->latitude); fwrite_double(file_out, wpt->longitude); @@ -710,32 +515,31 @@ static void write_rte_waypt(const Waypoint* wpt) start_new = 0; } -static void -gtm_write() +void +GtmFormat::write() { - waypt_disp_all(write_waypt); + auto write_waypt_lambda = [this](const Waypoint* waypointp)->void { + write_waypt(waypointp); + }; + waypt_disp_all(write_waypt_lambda); + if (waypt_count()) { gbfwrite(WAYPOINTSTYLES, 1, sizeof(WAYPOINTSTYLES)-1, file_out); } - track_disp_all(start_rte, nullptr, write_trk_waypt); - track_disp_all(write_trk_style, nullptr, nullptr); - route_disp_all(start_rte, nullptr, write_rte_waypt); -} -static -QVector gtm_args = { -}; - -ff_vecs_t gtm_vecs = { - ff_type_file, - FF_CAP_RW_ALL, - gtm_rd_init, - gtm_wr_init, - gtm_rd_deinit, - gtm_wr_deinit, - gtm_read, - gtm_write, - nullptr, - >m_args, - NULL_POS_OPS -}; + auto start_rte_lambda = [this](const route_head* rte)->void { + start_rte(rte); + }; + auto write_trk_style_lambda = [this](const route_head* rte)->void { + write_trk_style(rte); + }; + auto write_trk_waypt_lambda = [this](const Waypoint* waypointp)->void { + write_trk_waypt(waypointp); + }; + auto write_rte_waypt_lambda = [this](const Waypoint* waypointp)->void { + write_rte_waypt(waypointp); + }; + track_disp_all(start_rte_lambda, nullptr, write_trk_waypt_lambda); + track_disp_all(write_trk_style_lambda, nullptr, nullptr); + route_disp_all(start_rte_lambda, nullptr, write_rte_waypt_lambda); +} diff --git a/gtm.h b/gtm.h new file mode 100644 index 000000000..0473e435a --- /dev/null +++ b/gtm.h @@ -0,0 +1,287 @@ +/* + Support for GPS TrackMaker data file. + + Copyright (C) 2005 Gustavo Niemeyer . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* + * Documentation can be found at + * https://www.trackmaker.com/download/ref_guide_eng.pdf + * https://www.trackmaker.com/download/GTM211_format.pdf + */ +#ifndef GTM_H_INCLUDED_ +#define GTM_H_INCLUDED_ + +#include // for QString +#include // for QVector + +#include "defs.h" +#include "format.h" // for Format +#include "gbfile.h" // for gbfile + + +class GtmFormat : public Format +{ +public: + QVector* get_args() override + { + return nullptr; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + return FF_CAP_RW_ALL; + } + + void rd_init(const QString& fname) override; + void read() override; + void rd_deinit() override; + void wr_init(const QString& fname) override; + void write() override; + void wr_deinit() override; + +private: + /* Constants */ + + static constexpr int MAX_INDATUM_INDEX = 263; + + static constexpr int indatum_array[MAX_INDATUM_INDEX] = { + -1, // < 1 + 0, 0, 0, 0, 0, 0, 0, // < 8 : Adindan + 1, // < 9 : Afgooye + 2, // < 10 : Ain el Abd + -1, -1, -1, -1, // < 14 + 6, 6, 6, 6, 6, 6, 6, 6, 6, // < 23 : ARC 1950 + 7, 7, 7, // < 26 : ARC 1960 + 8, // < 27 : Ascension Island 58 + -1, -1, -1, -1, -1, // < 32 + 13, // < 33 : Australian Geo 84 + -1, // < 34 + 15, // < 35 : Bellevue IGN + 16, // < 36 : Bermuda 1957 + -1, -1, // < 38 + 17, // < 39 : Bukit Rimpah + 18, // < 40 : Camp Area Astro + 19, // < 41 : Campo Inchauspe + 22, // < 42 : Canton Islan 1966 + 23, // < 43 : Cape + 24, // < 44 : Cape Canaveral + 26, // < 45 : Carthe + 28, // < 46 : Chatham + 29, // < 47 : Chua Astro + 30, // < 48 : Corrego Alegre + -1, -1, // < 50 + 33, // < 51 : Djakarta (Batavia) + 34, // < 52 : DOS 1968 + 35, // < 53 : Easter Island 1967 + -1, // < 54 + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, // < 69 : European 1950 Mean + 39, // < 70 : European 1979 Mean + -1, // < 71 + 41, // < 72 : Gandajika + 42, // < 73 : Geodetic Datum 49 + -1, // < 74 + 45, // < 75 : Guam 1963 + 46, // < 76 : Gunung Segara + -1, // < 77 + 49, // < 78 : Hearth North + -1, // < 79 + 50, // < 80 : Hjorsey 1955 + 51, // < 81 : Hong Kong 1963 + 52, // < 82 : Hu-Tzu-Shan + 53, 53, 53, 53, 53, 53, 53, // < 89 : Indian + -1, // < 90 + 55, // < 91 : Ireland 1965 + -1, // < 92 + 56, // < 93 : ISTS 073 69 + 57, // < 94 : Johnston Island 61 + 58, // < 95 : Kandawala + 59, // < 96 : Kerguelen Island + 60, // < 97 : Kertau 48 + -1, -1, // < 99 + 61, // < 100 : L.C. 5 Astro + -1, // < 101 + 63, // < 102 : Liberia 1964 + 64, 64, // < 104 : Luzon + -1, // < 105 + 65, // < 106 : Mahe 1971 + -1, // < 107 + 69, // < 108 : Merchich + 71, // < 109 : Midway Astro 61 + 73, 73, // < 111 : Minna + -1, // < 112 + 75, 75, 75, // < 115 : Nahrwan + 76, // < 116 : Naparima BWI + 3, 3, 3, // < 119 : Alaska NAD27 + 14, 14, // < 121 : Bahamas NAD27 + 20, 20, 20, 20, 20, // < 126 : Canada Mean NAD27 + 21, // < 127 : Canal Zone NAD27 + 31, // < 128 : Cuba NAD27 + 44, // < 129 : Greenland NAD27 + -1, -1, // < 131 + 20, // < 132 : Canada Mean NAD27 + -1, -1, -1, // < 135 + 70, // < 136 : Mexico NAD27 + -1, -1, -1, -1, -1, -1, -1, -1, // < 144 + 80, // < 145 : Old Egyptian + 81, // < 146 : Old Hawaiian + 82, // < 147 : Old Hawaiian Kauai + 83, // < 148 : Old Hawaiian Maui + 81, // < 149 : Old Hawaiian Mean + 84, // < 150 : Old Hawaiian Oahu + 85, // < 151 : Oman + 86, 86, 86, 86, 86, // < 156 : OSG Britain + 87, // < 157 : Pico de Las Nieves + 88, // < 158 : Pitcairn Astro 67 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // < 171 + 91, // < 172 : Puerto Rico + 92, // < 173 : Pulkovo 1942 + 94, // < 174 : Quatar National + -1, -1, // < 176 + 95, // < 177 : Rome 1940 + 96, 96, 96, 96, 96, 96, 96, // < 184 : S-42 (Pulkovo 1942) + -1, // < 185 + 100, // < 186 : Santo DOS + 99, // < 187 : Sao Braz + -1, -1, -1, -1, // < 191 + 105, 105, // < 193 : SAD-69/Mean + 98, // < 194 : SAD-69/Brazil + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, // < 204 : SAD-69/Mean + 106, // < 205 : South Asia + 109, // < 206 : Tananarive 1926 + 111, // < 207 : Timbalai 1948 + 112, 112, 112, 112, // < 211 : Tokyo mean + 113, // < 212 : Tristan Astro 1968 + 115, // < 213 : Viti Levu 1916 + -1, -1, // < 215 + 116, // < 216 : Wake Eniwetok 1960 + 117, // < 217 : WGS 72 + 118, // < 218 : WGS 84 + 119, // < 219 : Yacare + 120, // < 220 : Zanderij + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // < 231 + 98, // < 232 : SAD-69/Brazil + -1, -1, // < 234 + 117, // < 235 : WGS 72 + 0, // < 236 : Adindan + 2, // < 237 : Ain el Abd + 7, // < 238 : ARC 1960 + 8, // < 239 : Ascension Island 58 + -1, -1, // < 241 + 52, // < 242 : Hu-Tzu-Shan + 53, 53, 53, // < 245 : Indian + -1, // < 246 + 57, // < 247 : Johnston Island 61 + 64, // < 248 : Luzon + -1, // < 249 + 75, // < 250 : Nahrwan + 76, // < 251 : Naparima BWI + -1, -1, -1, // < 254 + 82, // < 255 : Old Hawaiian Kauai + 83, // < 256 : Old Hawaiian Maui + 84, // < 257 : Old Hawaiian Oahu + -1, -1, // < 259 + 101, // < 260 : Sapper Hill 43 + 111, // < 261 : Timbalai 1948 + 112, // < 262 : Tokyo mean + 116 // < 263 : Wake Eniwetok 1960 + }; + + static constexpr const char* icon_descr[] = { + "", "Airport", "Ball Park", "Bank", "Bar", "Boat Ramp", "Campground", "Car", + "City (Large)", "City (Medium)", "City (Small)", "Dam", "Danger Area", + "Drinking Water", "Fishing Area", "Gas Station", "Glider Area", "Golf Course", + "Heliport", "Hotel", "Animals", "Information", "Man Overboard", "Marina", + "Mine", "Medical Facility", "Parachute Area", "Park", "Parking Area", + "Picnic Area", "Private Field", "Residence", "Restaurant", "Restroom", + "Scenic Area", "School", "Seaplane Base", "Shipwreck", "Shopping Center", + "Short Tower", "Policy Station", "Ski Resort", "Soft Field", "Swimming Area", + "Tall Tower", "Telephone", "Tracback Point", "Ultralight Area", "Waypoint", + "Boat", "Exit", "Flag", "Duck", "Buoy", "Back Track", "Beach", "Bridge", + "Building", "Car Repair", "Cemetery", "Church", "Civil", "Convenience Store", + "Crossing", "Fast Food", "Forest", "Ghost Town", "Levee", "Military", + "Oil Field", "Post Office", "Rv Park", "Scales", "Summit", "Toll Booth", + "Trail Head", "Truck Stop", "Tunnel", "Highway", "Gate", "Fall", "Fence", + "Mata-Burro", "Fitness Center", "Movie Theater", "Live Theater", "Zoo", "Horn", + "Bowling", "Car Rental", "City (Capitol)", "Controlled Area", "Stadium", + "Museum", "Amusement Park", "Skull", "Department Store", "Pharmacy", "Pizza", + "Diver Down Flag 1", "Light", "Pin", "", "Pigsty", "Tree", "Bamboo", + "Banana Plant", "Arrow-Down", "Bifurcation", "Cavern", "River", "Rock", + "Arrow-Up", "Trunk", "Soccer Field", "Sporting Court", "Flag, Green", "Trench", + "Ship-Yellow", "Green Sign", "Swamp", "Lake", "Stop!", + "Fishing Hot Spot Facility", "Speed Reducer", "Stairway", "Cactus", "Ship-Red", + "Letter - S", "Letter - D", "Letter - N", + "Crossing", "Cross", "Flag, Red", "Curve1", "Curve2", "Curve3", "Curve4", + "Letter - W", "Letter - L", "Letter - R", "Radio Beacon", "Road Sign", + "Geocache", "Geocache Found", "Traffic Light", "Bus Station", "Train Station", + "School", "Mile Marker", "Conservation Area", "Waypoint", "Box", "Aerial", + "Auto Repair", "Boat", "Exit Ramp", "Fixed Nav Aid", "Floating Buoy", "Garden", + "Fish Farm", "Lighthouse", "Truck Service", "Resort", "Scuba", "Shooting", + "Sight Seeing", "Sounding", "Winery", "Navaid, Amber", "Navaid, Black", + "Navaid, Blue", "Navaid, Green", "Navaid, Green/Red", "Navaid, Green/White", + "Navaid, Orange", "Navaid, Red", "Navaid, Red/Green", "Navaid, Red/White", + "Navaid, Violet", "Navaid, White", "Navaid, White/Green", "Navaid, White/Red", + "Buoy, White", "Dot, White", "Red Square", "Red Diamond", "Green Square", + "Green Diamond", "Restricted Area", "Navaid (unlit)", "Dot (Small)", "Libraries", "Waypoint", "Waypoint1", + "Waypoint2", "Mark (1)", "Mark (2)", "Mark (3)", "Cross (Red)", "Store", + "Exclamation", "Flag (EUA)", "Flag (CAN)", "Flag (BRA)", "Man", "Animals", + "Deer Tracks", "Tree Stand", "Bridge", "Fence", "Intersection", + "Non Direct Beacon", "VHF Omni Range", "Vor/Tacan", "Vor-Dme", + "1st Approach Fix", "Localizer Outer", "Missed Appr. Pt", "Tacan", + "CheckPoint", nullptr + }; + + /* Member Functions */ + + static QString fread_string(gbfile* fd); + static void fread_string_discard(gbfile* fd); + static QString fread_fixedstring(gbfile* fd, int len); + static void fwrite_null(gbfile* fd, int len); + static void fwrite_string(gbfile* fd, const char* str); + static void fwrite_string(gbfile* fd, const QString& str); + static void fwrite_fixedstring(gbfile* fd, const char* str, int fieldlen); + static void fwrite_fixedstring(gbfile* fd, const QString& str, int fieldlen); + void set_datum(int n); + void convert_datum(double* lat, double* lon) const; + void count_track_styles(const route_head* rte); + static int icon_from_descr(const QString& descr); + void write_waypt(const Waypoint* wpt); + void start_rte(const route_head* rte); + void write_trk_waypt(const Waypoint* wpt); + void write_trk_style(const route_head* trk); + void write_rte_waypt(const Waypoint* wpt); + + /* Data Members */ + + gbfile* file_in{}; + gbfile* file_out{}; + int indatum{}; + int wp_count{}; + int ws_count{}; + int tr_count{}; + int ts_count{}; + int rt_count{}; + int im_count{}; + const route_head* rte_active{}; + int start_new{}; +}; +#endif // GTM_H_INCLUDED_ diff --git a/gtrnctr.cc b/gtrnctr.cc index f53cccef6..5a306a79f 100644 --- a/gtrnctr.cc +++ b/gtrnctr.cc @@ -38,7 +38,7 @@ #include // for add_const<>::type #include "defs.h" // for Waypoint, route_head, computed_trkdata, waypt_add, route_disp, track_disp_all, case_ignore_strncmp, track_add_head, track_add_wpt, track_recompute, xml_parse_time, CSTR, wp_flags, WAYPT_SET, unknown_alt -#include "xmlgeneric.h" // for xg_string, build_xg_tag_map, xml_deinit, xml_init, xml_read +#include "xmlgeneric.h" // for xml_deinit, xml_init, xml_read #define MYNAME "gtc" @@ -46,19 +46,21 @@ void GtrnctrFormat::rd_init(const QString& fname) { - xml_init(fname, build_xg_tag_map(this, gtc_map), nullptr, gtc_tags_to_ignore, nullptr, true); + xml_reader = new XmlGenericReader; + xml_reader->xml_init(fname, this, gtc_map, nullptr, gtc_tags_to_ignore, nullptr); } void GtrnctrFormat::read() { - xml_read(); + xml_reader->xml_read(); } void GtrnctrFormat::rd_deinit() { - xml_deinit(); + delete xml_reader; + xml_reader = nullptr; } void @@ -359,39 +361,39 @@ GtrnctrFormat::write() } void -GtrnctrFormat::gtc_trk_s(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_s(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { trk_head = new route_head; track_add_head(trk_head); } void -GtrnctrFormat::gtc_trk_ident(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_ident(const QString& args, const QXmlStreamAttributes* /*unused*/) { trk_head->rte_name = args; } void -GtrnctrFormat::gtc_trk_lap_s(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_lap_s(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { lap_ct++; lap_s = 1; } void -GtrnctrFormat::gtc_trk_lap_e(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_lap_e(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { lap_s = 0; } void -GtrnctrFormat::gtc_trk_pnt_s(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_pnt_s(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { wpt_tmp = new Waypoint; } void -GtrnctrFormat::gtc_trk_pnt_e(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_pnt_e(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { if (wpt_tmp->longitude != 0. && wpt_tmp->latitude != 0.) { if (lap_s) { @@ -414,25 +416,25 @@ GtrnctrFormat::gtc_trk_pnt_e(xg_string /*unused*/, const QXmlStreamAttributes* / } void -GtrnctrFormat::gtc_trk_utc(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_utc(const QString& args, const QXmlStreamAttributes* /*unused*/) { wpt_tmp->creation_time = xml_parse_time(args); } void -GtrnctrFormat::gtc_trk_lat(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_lat(const QString& args, const QXmlStreamAttributes* /*unused*/) { wpt_tmp->latitude = args.toDouble(); } void -GtrnctrFormat::gtc_trk_long(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_long(const QString& args, const QXmlStreamAttributes* /*unused*/) { wpt_tmp->longitude = args.toDouble(); } void -GtrnctrFormat::gtc_trk_alt(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_alt(const QString& args, const QXmlStreamAttributes* /*unused*/) { wpt_tmp->altitude = args.toDouble(); } @@ -451,13 +453,13 @@ void GtrnctrFormat::gtc_trk_cad(const QString& args, const QXmlStreamAttributes* } void -GtrnctrFormat::gtc_trk_pwr(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_pwr(const QString& args, const QXmlStreamAttributes* /*unused*/) { wpt_tmp->power = args.toDouble(); } void -GtrnctrFormat::gtc_trk_spd(xg_string args, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_trk_spd(const QString& args, const QXmlStreamAttributes* /*unused*/) { wpt_tmp->set_speed(args.toDouble()); } @@ -469,7 +471,7 @@ GtrnctrFormat::gtc_wpt_crs_s(const QString& /*unused*/, const QXmlStreamAttribut } void -GtrnctrFormat::gtc_wpt_crs_e(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_wpt_crs_e(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { if (wpt_tmp->longitude != 0. && wpt_tmp->latitude != 0.) { waypt_add(wpt_tmp); @@ -481,14 +483,14 @@ GtrnctrFormat::gtc_wpt_crs_e(xg_string /*unused*/, const QXmlStreamAttributes* / } void -GtrnctrFormat::gtc_wpt_pnt_s(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_wpt_pnt_s(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { wpt_tmp = new Waypoint; lap_ct++; } void -GtrnctrFormat::gtc_wpt_pnt_e(xg_string /*unused*/, const QXmlStreamAttributes* /*unused*/) +GtrnctrFormat::gtc_wpt_pnt_e(const QString& /*unused*/, const QXmlStreamAttributes* /*unused*/) { if (wpt_tmp->longitude != 0. && wpt_tmp->latitude != 0.) { /* Add the begin position of a CourseLap as diff --git a/gtrnctr.h b/gtrnctr.h index 28a11d108..654b0d995 100644 --- a/gtrnctr.h +++ b/gtrnctr.h @@ -35,7 +35,7 @@ #include "format.h" // for Format #include "gbfile.h" // for gbfile #include "src/core/datetime.h" // for DateTime -#include "xmlgeneric.h" // for cb_cdata, xg_functor_map_entry, xg_string, cb_start, cb_end +#include "xmlgeneric.h" // for cb_cdata, xg_functor_map_entry, cb_start, cb_end class GtrnctrFormat : public Format @@ -97,25 +97,25 @@ class GtrnctrFormat : public Format void gtc_crs_hdr(const route_head* rte); void gtc_crs_ftr(const route_head* /* unused */); - void gtc_trk_s(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_trk_ident(xg_string args, const QXmlStreamAttributes* /* unused */); - void gtc_trk_lap_s(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_trk_lap_e(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_trk_pnt_s(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_trk_pnt_e(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_trk_utc(xg_string args, const QXmlStreamAttributes* /* unused */); - void gtc_trk_lat(xg_string args, const QXmlStreamAttributes* /* unused */); - void gtc_trk_long(xg_string args, const QXmlStreamAttributes* /* unused */); - void gtc_trk_alt(xg_string args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_s(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_trk_ident(const QString& args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_lap_s(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_trk_lap_e(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_trk_pnt_s(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_trk_pnt_e(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_trk_utc(const QString& args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_lat(const QString& args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_long(const QString& args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_alt(const QString& args, const QXmlStreamAttributes* /* unused */); void gtc_trk_dist(const QString& args, const QXmlStreamAttributes* /* unused */); void gtc_trk_hr(const QString& args, const QXmlStreamAttributes* /* unused */); void gtc_trk_cad(const QString& args, const QXmlStreamAttributes* /* unused */); - void gtc_trk_pwr(xg_string args, const QXmlStreamAttributes* /* unused */); - void gtc_trk_spd(xg_string args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_pwr(const QString& args, const QXmlStreamAttributes* /* unused */); + void gtc_trk_spd(const QString& args, const QXmlStreamAttributes* /* unused */); void gtc_wpt_crs_s(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_wpt_crs_e(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_wpt_pnt_s(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); - void gtc_wpt_pnt_e(xg_string /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_wpt_crs_e(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_wpt_pnt_s(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); + void gtc_wpt_pnt_e(const QString& /* unused */, const QXmlStreamAttributes* /* unused */); void gtc_wpt_ident(const QString& args, const QXmlStreamAttributes* /* unused */); void gtc_wpt_lat(const QString& args, const QXmlStreamAttributes* /* unused */); void gtc_wpt_long(const QString& args, const QXmlStreamAttributes* /* unused */); @@ -154,71 +154,72 @@ class GtrnctrFormat : public Format }, }; - QList> gtc_map = { + QList> gtc_map = { /* courses tcx v1 & v2 */ - { &GtrnctrFormat::gtc_trk_s, cb_start, "/Courses/Course" }, - { &GtrnctrFormat::gtc_trk_ident,cb_cdata, "/Courses/Course/Name"}, - { &GtrnctrFormat::gtc_trk_pnt_s,cb_start, "/Courses/Course/Track/Trackpoint" }, - { &GtrnctrFormat::gtc_trk_pnt_e,cb_end, "/Courses/Course/Track/Trackpoint" }, - { &GtrnctrFormat::gtc_trk_utc, cb_cdata, "/Courses/Course/Track/Trackpoint/Time" }, - { &GtrnctrFormat::gtc_trk_lat, cb_cdata, "/Courses/Course/Track/Trackpoint/Position/LatitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_long, cb_cdata, "/Courses/Course/Track/Trackpoint/Position/LongitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_alt, cb_cdata, "/Courses/Course/Track/Trackpoint/AltitudeMeters" }, - { &GtrnctrFormat::gtc_trk_hr, cb_cdata, "/Courses/Course/Track/Trackpoint/HeartRateBpm" }, - { &GtrnctrFormat::gtc_trk_cad, cb_cdata, "/Courses/Course/Track/Trackpoint/Cadence" }, - { &GtrnctrFormat::gtc_wpt_crs_s,cb_start, "/Courses/Course/CoursePoint" }, - { &GtrnctrFormat::gtc_wpt_crs_e,cb_end, "/Courses/Course/CoursePoint" }, - { &GtrnctrFormat::gtc_wpt_ident,cb_cdata, "/Courses/Course/CoursePoint/Name"}, - { &GtrnctrFormat::gtc_trk_utc, cb_cdata, "/Courses/Course/CoursePoint/Time"}, - { &GtrnctrFormat::gtc_wpt_lat, cb_cdata, "/Courses/Course/CoursePoint/Position/LatitudeDegrees"}, - { &GtrnctrFormat::gtc_wpt_long, cb_cdata, "/Courses/Course/CoursePoint/Position/LongitudeDegrees"}, - { &GtrnctrFormat::gtc_trk_alt, cb_cdata, "/Courses/Course/CoursePoint/AltitudeMeters" }, - { &GtrnctrFormat::gtc_wpt_icon, cb_cdata, "/Courses/Course/CoursePoint/PointType" }, - { &GtrnctrFormat::gtc_wpt_notes,cb_cdata, "/Courses/Course/CoursePoint/Notes" }, + { &GtrnctrFormat::gtc_trk_s, xg_cb_type::cb_start, "/Courses/Course" }, + { &GtrnctrFormat::gtc_trk_ident, xg_cb_type::cb_cdata, "/Courses/Course/Name"}, + { &GtrnctrFormat::gtc_trk_pnt_s, xg_cb_type::cb_start, "/Courses/Course/Track/Trackpoint" }, + { &GtrnctrFormat::gtc_trk_pnt_e, xg_cb_type::cb_end, "/Courses/Course/Track/Trackpoint" }, + { &GtrnctrFormat::gtc_trk_utc, xg_cb_type::cb_cdata, "/Courses/Course/Track/Trackpoint/Time" }, + { &GtrnctrFormat::gtc_trk_lat, xg_cb_type::cb_cdata, "/Courses/Course/Track/Trackpoint/Position/LatitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_long, xg_cb_type::cb_cdata, "/Courses/Course/Track/Trackpoint/Position/LongitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_alt, xg_cb_type::cb_cdata, "/Courses/Course/Track/Trackpoint/AltitudeMeters" }, + { &GtrnctrFormat::gtc_trk_hr, xg_cb_type::cb_cdata, "/Courses/Course/Track/Trackpoint/HeartRateBpm" }, + { &GtrnctrFormat::gtc_trk_cad, xg_cb_type::cb_cdata, "/Courses/Course/Track/Trackpoint/Cadence" }, + { &GtrnctrFormat::gtc_wpt_crs_s, xg_cb_type::cb_start, "/Courses/Course/CoursePoint" }, + { &GtrnctrFormat::gtc_wpt_crs_e, xg_cb_type::cb_end, "/Courses/Course/CoursePoint" }, + { &GtrnctrFormat::gtc_wpt_ident, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/Name"}, + { &GtrnctrFormat::gtc_trk_utc, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/Time"}, + { &GtrnctrFormat::gtc_wpt_lat, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/Position/LatitudeDegrees"}, + { &GtrnctrFormat::gtc_wpt_long, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/Position/LongitudeDegrees"}, + { &GtrnctrFormat::gtc_trk_alt, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/AltitudeMeters" }, + { &GtrnctrFormat::gtc_wpt_icon, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/PointType" }, + { &GtrnctrFormat::gtc_wpt_notes, xg_cb_type::cb_cdata, "/Courses/Course/CoursePoint/Notes" }, /* history tcx v2 (activities) */ - { &GtrnctrFormat::gtc_trk_s, cb_start, "/Activities/Activity" }, - { &GtrnctrFormat::gtc_trk_ident,cb_cdata, "/Activities/Activity/Id" }, - { &GtrnctrFormat::gtc_trk_lap_s,cb_start, "/Activities/Activity/Lap" }, - { &GtrnctrFormat::gtc_trk_lap_e,cb_end, "/Activities/Activity/Lap" }, - { &GtrnctrFormat::gtc_trk_pnt_s,cb_start, "/Activities/Activity/Lap/Track/Trackpoint" }, - { &GtrnctrFormat::gtc_trk_pnt_e,cb_end, "/Activities/Activity/Lap/Track/Trackpoint" }, - { &GtrnctrFormat::gtc_trk_utc, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Time" }, - { &GtrnctrFormat::gtc_trk_lat, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Position/LatitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_long, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Position/LongitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_alt, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/AltitudeMeters" }, - { &GtrnctrFormat::gtc_trk_dist, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/DistanceMeters" }, - { &GtrnctrFormat::gtc_trk_hr, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/HeartRateBpm" }, - { &GtrnctrFormat::gtc_trk_cad, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Cadence" }, - { &GtrnctrFormat::gtc_trk_pwr, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Extensions/ns3:TPX/ns3:Watts" }, + { &GtrnctrFormat::gtc_trk_s, xg_cb_type::cb_start, "/Activities/Activity" }, + { &GtrnctrFormat::gtc_trk_ident, xg_cb_type::cb_cdata, "/Activities/Activity/Id" }, + { &GtrnctrFormat::gtc_trk_lap_s, xg_cb_type::cb_start, "/Activities/Activity/Lap" }, + { &GtrnctrFormat::gtc_trk_lap_e, xg_cb_type::cb_end, "/Activities/Activity/Lap" }, + { &GtrnctrFormat::gtc_trk_pnt_s, xg_cb_type::cb_start, "/Activities/Activity/Lap/Track/Trackpoint" }, + { &GtrnctrFormat::gtc_trk_pnt_e, xg_cb_type::cb_end, "/Activities/Activity/Lap/Track/Trackpoint" }, + { &GtrnctrFormat::gtc_trk_utc, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Time" }, + { &GtrnctrFormat::gtc_trk_lat, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Position/LatitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_long, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Position/LongitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_alt, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/AltitudeMeters" }, + { &GtrnctrFormat::gtc_trk_dist, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/DistanceMeters" }, + { &GtrnctrFormat::gtc_trk_hr, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/HeartRateBpm" }, + { &GtrnctrFormat::gtc_trk_cad, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Cadence" }, + { &GtrnctrFormat::gtc_trk_pwr, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Extensions/ns3:TPX/ns3:Watts" }, // Sample from Marcelo Kittlein 5/2014 declares a default namespace with the start tag of the TPX element, // and thus doesn't use prefixes. - { &GtrnctrFormat::gtc_trk_pwr, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Extensions/TPX/Watts" }, + { &GtrnctrFormat::gtc_trk_pwr, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Extensions/TPX/Watts" }, // It looks like Speed and Watts should be siblings, but Garmin can't get // their namespace act very consistent. This works for a sample provided // by Laurent Desmons in 5/2013. - { &GtrnctrFormat::gtc_trk_spd, cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Extensions/TPX/Speed" }, + { &GtrnctrFormat::gtc_trk_spd, xg_cb_type::cb_cdata, "/Activities/Activity/Lap/Track/Trackpoint/Extensions/TPX/Speed" }, /* history tcx v1 */ - { &GtrnctrFormat::gtc_trk_s, cb_start, "/History/Run" }, - { &GtrnctrFormat::gtc_trk_ident,cb_cdata, "/History/Run/Id" }, - { &GtrnctrFormat::gtc_trk_lap_s,cb_start, "/History/Run/Lap" }, - { &GtrnctrFormat::gtc_trk_lap_e,cb_end, "/History/Run/Lap" }, - { &GtrnctrFormat::gtc_trk_pnt_s,cb_start, "/History/Run/Lap/Track/Trackpoint" }, - { &GtrnctrFormat::gtc_trk_pnt_e,cb_end, "/History/Run/Lap/Track/Trackpoint" }, - { &GtrnctrFormat::gtc_trk_utc, cb_cdata, "/History/Run/Lap/Track/Trackpoint/Time" }, - { &GtrnctrFormat::gtc_trk_lat, cb_cdata, "/History/Run/Lap/Track/Trackpoint/Position/LatitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_long, cb_cdata, "/History/Run/Lap/Track/Trackpoint/Position/LongitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_alt, cb_cdata, "/History/Run/Lap/Track/Trackpoint/AltitudeMeters" }, - { &GtrnctrFormat::gtc_trk_hr, cb_cdata, "/History/Run/Lap/Track/Trackpoint/HeartRateBpm" }, - { &GtrnctrFormat::gtc_trk_cad, cb_cdata, "/History/Run/Lap/Track/Trackpoint/Cadence" }, - - { &GtrnctrFormat::gtc_wpt_pnt_s,cb_start, "/Courses/Course/Lap/BeginPosition" }, - { &GtrnctrFormat::gtc_wpt_pnt_e,cb_end, "/Courses/Course/Lap/BeginPosition" }, - { &GtrnctrFormat::gtc_wpt_lat, cb_cdata, "/Courses/Course/Lap/BeginPosition/LatitudeDegrees" }, - { &GtrnctrFormat::gtc_wpt_long, cb_cdata, "/Courses/Course/Lap/BeginPosition/LongitudeDegrees" }, - { &GtrnctrFormat::gtc_trk_alt, cb_cdata, "/Courses/Course/Lap/BeginAltitudeMeters" } + { &GtrnctrFormat::gtc_trk_s, xg_cb_type::cb_start, "/History/Run" }, + { &GtrnctrFormat::gtc_trk_ident, xg_cb_type::cb_cdata, "/History/Run/Id" }, + { &GtrnctrFormat::gtc_trk_lap_s, xg_cb_type::cb_start, "/History/Run/Lap" }, + { &GtrnctrFormat::gtc_trk_lap_e, xg_cb_type::cb_end, "/History/Run/Lap" }, + { &GtrnctrFormat::gtc_trk_pnt_s, xg_cb_type::cb_start, "/History/Run/Lap/Track/Trackpoint" }, + { &GtrnctrFormat::gtc_trk_pnt_e, xg_cb_type::cb_end, "/History/Run/Lap/Track/Trackpoint" }, + { &GtrnctrFormat::gtc_trk_utc, xg_cb_type::cb_cdata, "/History/Run/Lap/Track/Trackpoint/Time" }, + { &GtrnctrFormat::gtc_trk_lat, xg_cb_type::cb_cdata, "/History/Run/Lap/Track/Trackpoint/Position/LatitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_long, xg_cb_type::cb_cdata, "/History/Run/Lap/Track/Trackpoint/Position/LongitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_alt, xg_cb_type::cb_cdata, "/History/Run/Lap/Track/Trackpoint/AltitudeMeters" }, + { &GtrnctrFormat::gtc_trk_hr, xg_cb_type::cb_cdata, "/History/Run/Lap/Track/Trackpoint/HeartRateBpm" }, + { &GtrnctrFormat::gtc_trk_cad, xg_cb_type::cb_cdata, "/History/Run/Lap/Track/Trackpoint/Cadence" }, + + { &GtrnctrFormat::gtc_wpt_pnt_s, xg_cb_type::cb_start, "/Courses/Course/Lap/BeginPosition" }, + { &GtrnctrFormat::gtc_wpt_pnt_e, xg_cb_type::cb_end, "/Courses/Course/Lap/BeginPosition" }, + { &GtrnctrFormat::gtc_wpt_lat, xg_cb_type::cb_cdata, "/Courses/Course/Lap/BeginPosition/LatitudeDegrees" }, + { &GtrnctrFormat::gtc_wpt_long, xg_cb_type::cb_cdata, "/Courses/Course/Lap/BeginPosition/LongitudeDegrees" }, + { &GtrnctrFormat::gtc_trk_alt, xg_cb_type::cb_cdata, "/Courses/Course/Lap/BeginAltitudeMeters" } }; + XmlGenericReader* xml_reader{nullptr}; int gtc_indent_level{}; }; diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 97062e8a9..04e095498 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -22,19 +22,18 @@ if(NOT UNIX OR APPLE) endif() # Find the QtCore library -find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) -find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network SerialPort Widgets Xml REQUIRED) -list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::SerialPort Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Xml) -if(${Qt${QT_VERSION_MAJOR}Core_VERSION} VERSION_LESS 5.12) - message(FATAL_ERROR "Qt version ${Qt${QT_VERSION_MAJOR}Core_VERSION} found, but version 5.12 or newer is required.") +find_package(Qt6 REQUIRED COMPONENTS Core Gui Network SerialPort Widgets Xml) +list(APPEND QT_LIBRARIES Qt6::Core Qt6::Gui Qt6::Network Qt6::SerialPort Qt6::Widgets Qt6::Xml) +if(${Qt6Core_VERSION} VERSION_LESS 6.2) + message(FATAL_ERROR "Qt version ${Qt6Core_VERSION} found, but version 6.2 or newer is required.") else() - message(STATUS "Using Qt${QT_VERSION_MAJOR} version ${Qt${QT_VERSION_MAJOR}Core_VERSION}") + message(STATUS "Using Qt6 version ${Qt6Core_VERSION}") endif() option(GPSBABEL_MAPPREVIEW "enable map preview." ON) if (GPSBABEL_MAPPREVIEW) - find_package(Qt${QT_VERSION_MAJOR} COMPONENTS WebEngineWidgets WebChannel REQUIRED) - list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::WebEngineWidgets Qt${QT_VERSION_MAJOR}::WebChannel) + find_package(Qt6 REQUIRED COMPONENTS WebEngineWidgets WebChannel) + list(APPEND QT_LIBRARIES Qt6::WebEngineWidgets Qt6::WebChannel) else() target_compile_definitions(gpsbabelfe PRIVATE DISABLE_MAPPREVIEW) endif() @@ -173,9 +172,9 @@ message(STATUS "Libs are: \"${LnkLibs}\"") get_target_property(IncDirs gpsbabelfe INCLUDE_DIRECTORIES) message(STATUS "Include Directores are: \"${IncDirs}\"") -find_package(Qt${QT_VERSION_MAJOR} QUIET COMPONENTS LinguistTools) -if (NOT Qt${QT_VERSION_MAJOR}LinguistTools_FOUND) - message(WARNING "Qt${QT_VERSION_MAJOR}LinguistTools not found, gpsbabelfe translations cannot be updated or released, and application cannot be packaged.") +find_package(Qt6 QUIET COMPONENTS LinguistTools) +if (NOT Qt6LinguistTools_FOUND) + message(WARNING "Qt6LinguistTools not found, gpsbabelfe translations cannot be updated or released, and application cannot be packaged.") else() # FIXME: translations updated and released in source directory (and under version control). list(APPEND TRANSLATIONS gpsbabelfe_de.ts) @@ -186,19 +185,19 @@ else() list(APPEND TRANSLATIONS gpsbabelfe_ru.ts) add_custom_target(gpsbabelfe_lupdate - COMMAND Qt${QT_VERSION_MAJOR}::lupdate ${SOURCES} ${FORMS} -ts ${TRANSLATIONS} + COMMAND Qt6::lupdate ${SOURCES} ${FORMS} -ts ${TRANSLATIONS} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM USES_TERMINAL) add_custom_target(gpsbabelfe_lrelease - COMMAND Qt${QT_VERSION_MAJOR}::lrelease ${TRANSLATIONS} + COMMAND Qt6::lrelease ${TRANSLATIONS} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS gpsbabelfe_lupdate VERBATIM USES_TERMINAL) if(APPLE) - get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) + get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) add_custom_target(package_app COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/package_app -a $ -q ${_qmake_executable} -g $ -s ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E copy $/../GPSBabelFE.dmg ${CMAKE_CURRENT_BINARY_DIR} @@ -206,7 +205,7 @@ else() VERBATIM USES_TERMINAL) elseif(UNIX) - get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) + get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) add_custom_target(package_app COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/package_app -a $ -q ${_qmake_executable} -g $ -s ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS gpsbabelfe gpsbabel gpsbabelfe_lrelease coretool_lrelease @@ -220,7 +219,7 @@ else() endif() # in 5.12.12 cmake doesn't know about windeployqt, look in directory that has qmake. - get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) + get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) find_program(WINDEPLOYQT NAMES windeployqt PATHS "${_qt_bin_dir}" NO_DEFAULT_PATH) if (WINDEPLOYQT STREQUAL "WINDEPLOYQT-NOTFOUND") diff --git a/gui/aboutui.ui b/gui/aboutui.ui index b96ed8495..d8a501d57 100644 --- a/gui/aboutui.ui +++ b/gui/aboutui.ui @@ -83,7 +83,7 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> diff --git a/gui/coretool/CMakeLists.txt b/gui/coretool/CMakeLists.txt index dbe37b739..aa3df9a0c 100644 --- a/gui/coretool/CMakeLists.txt +++ b/gui/coretool/CMakeLists.txt @@ -4,9 +4,8 @@ endif() add_executable(coretool EXCLUDE_FROM_ALL) -find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) -find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets REQUIRED) -list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Widgets) +find_package(Qt6 REQUIRED COMPONENTS Core Widgets) +list(APPEND QT_LIBRARIES Qt6::Core Qt6::Widgets) list(APPEND SOURCES ../formatload.cc) list(APPEND SOURCES coretool.cc) @@ -22,7 +21,7 @@ target_link_libraries(coretool ${QT_LIBRARIES}) # FIXME: core_strings.h generated in source directory (and under version control). # FIXME: translations updated and released in source directory (and under version control). -get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) +get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION) get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/core_strings.h COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_CURRENT_BINARY_DIR} @@ -39,26 +38,26 @@ list(APPEND TRANSLATIONS gpsbabel_hu.ts) list(APPEND TRANSLATIONS gpsbabel_it.ts) list(APPEND TRANSLATIONS gpsbabel_ru.ts) -find_package(Qt${QT_VERSION_MAJOR} QUIET COMPONENTS LinguistTools) -if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND) +find_package(Qt6 QUIET COMPONENTS LinguistTools) +if(Qt6LinguistTools_FOUND) # The line numbers are almost meaningless the way we generate corestrings.h, and we force everything to the same context. # With line numbers and the similartext heuristic enabled translations can be copied from an old message to a new message, # and marked as unfinished. The threshold for similar is low. # These will be used by the application, even though they really need to be checked. # Disable the similartext heuristic to avoid these mistranslations. add_custom_target(coretool_lupdate - COMMAND Qt${QT_VERSION_MAJOR}::lupdate -disable-heuristic similartext core_strings.h -ts ${TRANSLATIONS} + COMMAND Qt6::lupdate -disable-heuristic similartext core_strings.h -ts ${TRANSLATIONS} DEPENDS core_strings.h WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM USES_TERMINAL) add_custom_target(coretool_lrelease - COMMAND Qt${QT_VERSION_MAJOR}::lrelease ${TRANSLATIONS} + COMMAND Qt6::lrelease ${TRANSLATIONS} DEPENDS coretool_lupdate WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM USES_TERMINAL) else() - message(WARNING "Qt${QT_VERSION_MAJOR}LinguistTools not found, coretool translations cannot be updated or released.") + message(WARNING "Qt6LinguistTools not found, coretool translations cannot be updated or released.") endif() diff --git a/gui/coretool/core_strings.h b/gui/coretool/core_strings.h index f71707686..b72f97206 100644 --- a/gui/coretool/core_strings.h +++ b/gui/coretool/core_strings.h @@ -1,12 +1,3 @@ -QT_TRANSLATE_NOOP("core","Brauniger IQ Series Barograph Download") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Cambridge/Winpilot glider software") QT_TRANSLATE_NOOP("core","Columbus/Visiontac V900 files (.csv)") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") @@ -15,6 +6,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Comma separated values") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") @@ -23,6 +15,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Data Logger iBlue747 csv") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") @@ -31,38 +24,17 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Data Logger iBlue757 csv") -QT_TRANSLATE_NOOP("core","DeLorme GPL") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","DeLorme Street Atlas Plus") -QT_TRANSLATE_NOOP("core","Keep turns if simplify filter is used") -QT_TRANSLATE_NOOP("core","Only read turns; skip all other points") -QT_TRANSLATE_NOOP("core","Split into multiple routes at turns") -QT_TRANSLATE_NOOP("core","Read control points as waypoint/route/none") -QT_TRANSLATE_NOOP("core","Synthesize track times") -QT_TRANSLATE_NOOP("core","DeLorme Street Atlas Route") -QT_TRANSLATE_NOOP("core","Destinator Itineraries (.dat)") -QT_TRANSLATE_NOOP("core","Destinator Points of Interest (.dat)") -QT_TRANSLATE_NOOP("core","Destinator TrackLogs (.dat)") -QT_TRANSLATE_NOOP("core","EasyGPS binary format") QT_TRANSLATE_NOOP("core","Set waypoint name to source filename") QT_TRANSLATE_NOOP("core","Time-frame (in seconds)") QT_TRANSLATE_NOOP("core","Locate waypoint for tagging by this name") QT_TRANSLATE_NOOP("core","!OVERWRITE! the original file. Default=N") +QT_TRANSLATE_NOOP("core","Image Offset Time (+HH:MM or -HH:MM)") QT_TRANSLATE_NOOP("core","Embedded Exif-GPS data (.jpg)") -QT_TRANSLATE_NOOP("core","Time zone ID") -QT_TRANSLATE_NOOP("core","Energympro GPS training watch") -QT_TRANSLATE_NOOP("core","Enigma binary waypoint file (.ert)") QT_TRANSLATE_NOOP("core","Source for name field in .dbf") QT_TRANSLATE_NOOP("core","Source for URL field in .dbf") QT_TRANSLATE_NOOP("core","ESRI shapefile") -QT_TRANSLATE_NOOP("core","F90G Automobile DVR GPS log file") QT_TRANSLATE_NOOP("core","(integer sec or 'auto') Barograph to GPS time diff") QT_TRANSLATE_NOOP("core","FAI/IGC Flight Recorder Data Format") QT_TRANSLATE_NOOP("core","Read all points even if latitude or longitude is missing") @@ -75,25 +47,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","FlySight GPS File") -QT_TRANSLATE_NOOP("core","Default speed for waypoints (knots/hr)") -QT_TRANSLATE_NOOP("core","Split input into separate files") -QT_TRANSLATE_NOOP("core","Franson GPSGate Simulation") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Fugawi") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Garmin 301 Custom position and heartrate") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") @@ -102,8 +56,8 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Garmin G1000 datalog input filter file") -QT_TRANSLATE_NOOP("core","Garmin Logbook XML") QT_TRANSLATE_NOOP("core","Default category on output (1..16)") QT_TRANSLATE_NOOP("core","Bitmap of categories") QT_TRANSLATE_NOOP("core","Version of gdb file to generate (1..3)") @@ -127,6 +81,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Garmin POI database") QT_TRANSLATE_NOOP("core","Enable alerts on speed or proximity distance") QT_TRANSLATE_NOOP("core","Use specified bitmap on output") @@ -153,6 +108,7 @@ QT_TRANSLATE_NOOP("core","Sync GPS time to computer time") QT_TRANSLATE_NOOP("core","Category number to use for written waypoints") QT_TRANSLATE_NOOP("core","Bitmap of categories") QT_TRANSLATE_NOOP("core","Speed in bits per second of serial port (baud=9600)") +QT_TRANSLATE_NOOP("core","override codec to use for device") QT_TRANSLATE_NOOP("core","Garmin serial/USB protocol") QT_TRANSLATE_NOOP("core","Write course rather than history, default yes") QT_TRANSLATE_NOOP("core","Sport: Biking (deflt), Running, MultiSport, Other") @@ -160,19 +116,8 @@ QT_TRANSLATE_NOOP("core","Garmin Training Center (.tcx/.crs/.hst/.xml)") QT_TRANSLATE_NOOP("core","Default icon name") QT_TRANSLATE_NOOP("core","Omit Placer name") QT_TRANSLATE_NOOP("core","Geocaching.com .loc") -QT_TRANSLATE_NOOP("core","Geogrid-Viewer ascii overlay file (.ovl)") -QT_TRANSLATE_NOOP("core","Geogrid-Viewer binary overlay file (.ovl)") -QT_TRANSLATE_NOOP("core","Geogrid-Viewer tracklogs (.log)") QT_TRANSLATE_NOOP("core","Compact Output. Default is off.") QT_TRANSLATE_NOOP("core","GeoJson") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","GEOnet Names Server (GNS)") QT_TRANSLATE_NOOP("core","Erase device data after download") QT_TRANSLATE_NOOP("core","Only erase device data, do not download anything") QT_TRANSLATE_NOOP("core","GlobalSat DG-100/BT-335 Download") @@ -185,7 +130,6 @@ QT_TRANSLATE_NOOP("core","Dump raw data to this file") QT_TRANSLATE_NOOP("core","Dump raw data to this file") QT_TRANSLATE_NOOP("core","Time zone ID") QT_TRANSLATE_NOOP("core","GlobalSat GH625XT GPS training watch") -QT_TRANSLATE_NOOP("core","Google Directions XML") QT_TRANSLATE_NOOP("core","Default icon name") QT_TRANSLATE_NOOP("core","Export linestrings for tracks and routes") QT_TRANSLATE_NOOP("core","Export placemarks for tracks and routes") @@ -202,7 +146,7 @@ QT_TRANSLATE_NOOP("core","Retain at most this number of position points (0 = un QT_TRANSLATE_NOOP("core","Rotate colors for tracks and routes (default automatic)") QT_TRANSLATE_NOOP("core","Precision of coordinates, number of decimals") QT_TRANSLATE_NOOP("core","Google Earth (Keyhole) Markup Language") -QT_TRANSLATE_NOOP("core","Google Navigator Tracklines (.trl)") +QT_TRANSLATE_NOOP("core","Google Takeout Location History") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") @@ -210,6 +154,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","GPS Tracking Key Pro text") QT_TRANSLATE_NOOP("core","GPS TrackMaker") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") @@ -219,6 +164,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","GPSBabel arc filter file") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") @@ -227,6 +173,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","GpsDrive Format") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") @@ -235,6 +182,7 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","GpsDrive Format for Tracks") QT_TRANSLATE_NOOP("core","Length of generated shortnames") QT_TRANSLATE_NOOP("core","No whitespace in generated shortnames") @@ -245,8 +193,6 @@ QT_TRANSLATE_NOOP("core","Add info (depth) as Humminbird extension") QT_TRANSLATE_NOOP("core","Add info (depth) as Garmin extension") QT_TRANSLATE_NOOP("core","Precision of elevations, number of decimals") QT_TRANSLATE_NOOP("core","GPX XML") -QT_TRANSLATE_NOOP("core","HikeTech") -QT_TRANSLATE_NOOP("core","Holux (gm-100) .wpo Format") QT_TRANSLATE_NOOP("core","MTK compatible CSV output file") QT_TRANSLATE_NOOP("core","Holux M-241 (MTK based) Binary File Format") QT_TRANSLATE_NOOP("core","Erase device data after download") @@ -263,44 +209,6 @@ QT_TRANSLATE_NOOP("core","Units for altitude (f)eet or (m)etres") QT_TRANSLATE_NOOP("core","HTML Output") QT_TRANSLATE_NOOP("core","Humminbird tracks (.ht)") QT_TRANSLATE_NOOP("core","Humminbird waypoints and routes (.hwr)") -QT_TRANSLATE_NOOP("core","Index of track to write (if more than one in source)") -QT_TRANSLATE_NOOP("core","IGN Rando track files") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","iGo Primo points of interest (.upoi)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","iGO2008 points of interest (.upoi)") -QT_TRANSLATE_NOOP("core","Track identification number") -QT_TRANSLATE_NOOP("core","Track title") -QT_TRANSLATE_NOOP("core","Track description") -QT_TRANSLATE_NOOP("core","IGO8 .trk") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Kompass (DAV) Track (.tk)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Kompass (DAV) Waypoints (.wp)") QT_TRANSLATE_NOOP("core","(USR input) Ignore event marker icons on read") QT_TRANSLATE_NOOP("core","(USR output) Treat waypoints as icons on write") QT_TRANSLATE_NOOP("core","(USR output) Merge into one segmented trail") @@ -310,66 +218,6 @@ QT_TRANSLATE_NOOP("core","(USR output) Output file title string") QT_TRANSLATE_NOOP("core","(USR output) Device serial number") QT_TRANSLATE_NOOP("core","(USR output) Output file content description") QT_TRANSLATE_NOOP("core","Lowrance USR") -QT_TRANSLATE_NOOP("core","Default icon name") -QT_TRANSLATE_NOOP("core","Max number of comments to write (maxcmts=200)") -QT_TRANSLATE_NOOP("core","Magellan SD files (as for eXplorist)") -QT_TRANSLATE_NOOP("core","Default icon name") -QT_TRANSLATE_NOOP("core","Max number of comments to write (maxcmts=200)") -QT_TRANSLATE_NOOP("core","Magellan SD files (as for Meridian)") -QT_TRANSLATE_NOOP("core","Default icon name") -QT_TRANSLATE_NOOP("core","Max number of comments to write (maxcmts=200)") -QT_TRANSLATE_NOOP("core","Numeric value of bitrate (baud=4800)") -QT_TRANSLATE_NOOP("core","Suppress use of handshaking in name of speed") -QT_TRANSLATE_NOOP("core","Delete all waypoints") -QT_TRANSLATE_NOOP("core","Magellan serial protocol") -QT_TRANSLATE_NOOP("core","MagicMaps IK3D project file (.ikt)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Mainnav") -QT_TRANSLATE_NOOP("core","Include only via stations in route") -QT_TRANSLATE_NOOP("core","Map&Guide 'TourExchangeFormat' XML") -QT_TRANSLATE_NOOP("core","MapAsia track file (.tr7)") -QT_TRANSLATE_NOOP("core","Mapbar (China) navigation track for Sonim Xp3300") -QT_TRANSLATE_NOOP("core","Mapfactor Navigator") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Mapopolis.com Mapconverter CSV") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","MapTech Exchange Format") -QT_TRANSLATE_NOOP("core","Speed in bits per second of serial port (autodetect=0)") -QT_TRANSLATE_NOOP("core","Download logged fixes") -QT_TRANSLATE_NOOP("core","Erase device data after download") -QT_TRANSLATE_NOOP("core","Show device status") -QT_TRANSLATE_NOOP("core","Enable logging after download") -QT_TRANSLATE_NOOP("core","MediaTek Locus") -QT_TRANSLATE_NOOP("core","Write items 'locked' [default no]") -QT_TRANSLATE_NOOP("core","Write items 'visible' [default yes]") -QT_TRANSLATE_NOOP("core","Write files with internal version [n]") -QT_TRANSLATE_NOOP("core","Memory-Map Navigator overlay files (.mmo)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Microsoft Streets and Trips 2002-2007") QT_TRANSLATE_NOOP("core","Baud rate used for download") QT_TRANSLATE_NOOP("core","Dump raw data to this file") QT_TRANSLATE_NOOP("core","Erase device data after download") @@ -389,19 +237,6 @@ QT_TRANSLATE_NOOP("core","MiniHomer, a skyTraq Venus 6 based logger (download tr QT_TRANSLATE_NOOP("core","Garmin Mobile XT ([ATRK]/STRK)") QT_TRANSLATE_NOOP("core","Track name processing option ([0]-nrm/1-ign)") QT_TRANSLATE_NOOP("core","Mobile Garmin XT Track files") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Motoactiv CSV") -QT_TRANSLATE_NOOP("core","Index of route to write (if more than one in source)") -QT_TRANSLATE_NOOP("core","New name for the route") -QT_TRANSLATE_NOOP("core","Radius of our big earth (default 6371000 meters)") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","Motorrad Routenplaner (Map&Guide) .bcr files") QT_TRANSLATE_NOOP("core","MTK compatible CSV output file") QT_TRANSLATE_NOOP("core","MTK Logger (iBlue 747,...) Binary File Format") QT_TRANSLATE_NOOP("core","Erase device data after download") @@ -410,45 +245,10 @@ QT_TRANSLATE_NOOP("core","Enable logging after download") QT_TRANSLATE_NOOP("core","MTK compatible CSV output file") QT_TRANSLATE_NOOP("core","Size of blocks in KB to request from device") QT_TRANSLATE_NOOP("core","MTK Logger (iBlue 747,Qstarz BT-1000,...) download") -QT_TRANSLATE_NOOP("core","MyNav TRC format") QT_TRANSLATE_NOOP("core","Datum (default=NAD27)") QT_TRANSLATE_NOOP("core","National Geographic Topo .tpg (waypoints)") QT_TRANSLATE_NOOP("core","National Geographic Topo 2.x .tpo") QT_TRANSLATE_NOOP("core","National Geographic Topo 3.x/4.x .tpo") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Navigon Waypoints") -QT_TRANSLATE_NOOP("core","Delete all track points") -QT_TRANSLATE_NOOP("core","Delete all routes") -QT_TRANSLATE_NOOP("core","Delete all waypoints") -QT_TRANSLATE_NOOP("core","Clear the datalog") -QT_TRANSLATE_NOOP("core","Read from datalogger buffer") -QT_TRANSLATE_NOOP("core","Command unit to power itself down") -QT_TRANSLATE_NOOP("core","NaviGPS GT-11/BGT-11 Download") -QT_TRANSLATE_NOOP("core","NaviGPS GT-31/BGT-31 datalogger (.sbp)") -QT_TRANSLATE_NOOP("core","NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)") -QT_TRANSLATE_NOOP("core","Navitel binary track (.bin)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Navitrak DNA marker format") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","NIMA/GNIS Geographic Names File") QT_TRANSLATE_NOOP("core","Max length of waypoint name to write") QT_TRANSLATE_NOOP("core","Read/write GPRMC sentences") QT_TRANSLATE_NOOP("core","Read/write GPGGA sentences") @@ -462,8 +262,6 @@ QT_TRANSLATE_NOOP("core","Speed in bits per second of serial port (baud=4800)") QT_TRANSLATE_NOOP("core","Write tracks for Gisteq Phototracker") QT_TRANSLATE_NOOP("core","Accept position fixes in gpgga marked invalid") QT_TRANSLATE_NOOP("core","NMEA 0183 sentences") -QT_TRANSLATE_NOOP("core","Compact binary representation") -QT_TRANSLATE_NOOP("core","Nokia Landmark Exchange") QT_TRANSLATE_NOOP("core","Write additional way tag key/value pairs") QT_TRANSLATE_NOOP("core","Write additional node tag key/value pairs") QT_TRANSLATE_NOOP("core","Use this value as custom created_by value") @@ -481,24 +279,6 @@ QT_TRANSLATE_NOOP("core","Unit used in proximity values") QT_TRANSLATE_NOOP("core","codec to use for reading and writing strings (default windows-1252)") QT_TRANSLATE_NOOP("core","OziExplorer") QT_TRANSLATE_NOOP("core","Qstarz BL-1000") -QT_TRANSLATE_NOOP("core","Default location") -QT_TRANSLATE_NOOP("core","Raymarine Waypoint File (.rwf)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","Ricoh GPS Log File") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","See You flight analysis data") QT_TRANSLATE_NOOP("core","Erase device data after download") QT_TRANSLATE_NOOP("core","Set location finder target location as lat,lng") QT_TRANSLATE_NOOP("core","Configure logging parameter as tmin:tmax:dmin:dmax") @@ -522,7 +302,6 @@ QT_TRANSLATE_NOOP("core","GPS time at position video_time (hhmmss[.sss], default QT_TRANSLATE_NOOP("core","GPS date at position video_time (yyyymmdd, default is first timestamp of track)") QT_TRANSLATE_NOOP("core","Format for subtitles") QT_TRANSLATE_NOOP("core","SubRip subtitles for video mapping (.srt)") -QT_TRANSLATE_NOOP("core","Swiss Map 25/50/100 (.xol)") QT_TRANSLATE_NOOP("core","Max synthesized shortname length") QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") @@ -530,8 +309,8 @@ QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") QT_TRANSLATE_NOOP("core","Use shortname instead of description") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") +QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") QT_TRANSLATE_NOOP("core","Tab delimited fields useful for OpenOffice") -QT_TRANSLATE_NOOP("core","Teletype [ Get Jonathon Johnson to describe") QT_TRANSLATE_NOOP("core","Suppress separator lines between waypoints") QT_TRANSLATE_NOOP("core","Encrypt hints using ROT13") QT_TRANSLATE_NOOP("core","Include groundspeak logs if present") @@ -539,33 +318,6 @@ QT_TRANSLATE_NOOP("core","Degrees output as 'ddd', 'dmm'(default) or 'dms'") QT_TRANSLATE_NOOP("core","Units for altitude (f)eet or (m)etres") QT_TRANSLATE_NOOP("core","Write each waypoint in a separate file") QT_TRANSLATE_NOOP("core","Textual Output") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","TomTom Itineraries (.itn)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","TomTom Places Itineraries (.itn)") -QT_TRANSLATE_NOOP("core","Max synthesized shortname length") -QT_TRANSLATE_NOOP("core","Allow whitespace synth. shortnames") -QT_TRANSLATE_NOOP("core","UPPERCASE synth. shortnames") -QT_TRANSLATE_NOOP("core","Make synth. shortnames unique") -QT_TRANSLATE_NOOP("core","Basename prepended to URL on output") -QT_TRANSLATE_NOOP("core","Use shortname instead of description") -QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") -QT_TRANSLATE_NOOP("core","TomTom POI file (.asc)") -QT_TRANSLATE_NOOP("core","TomTom POI file (.ov2)") -QT_TRANSLATE_NOOP("core","Index of track (if more than one in source)") -QT_TRANSLATE_NOOP("core","TrackLogs digital mapping (.trl)") QT_TRANSLATE_NOOP("core","GPS datum (def. WGS 84)") QT_TRANSLATE_NOOP("core","Write position using this grid.") QT_TRANSLATE_NOOP("core","Write timestamps with offset x to UTC time") @@ -574,14 +326,3 @@ QT_TRANSLATE_NOOP("core","Write filename(s) from input session(s)") QT_TRANSLATE_NOOP("core","Universal csv with field structure in first line") QT_TRANSLATE_NOOP("core","Encrypt hints using ROT13") QT_TRANSLATE_NOOP("core","Vcard Output (for iPod)") -QT_TRANSLATE_NOOP("core","Wintec TES file") -QT_TRANSLATE_NOOP("core","Wintec WBT-100/200 Binary File Format") -QT_TRANSLATE_NOOP("core","Erase device data after download") -QT_TRANSLATE_NOOP("core","Wintec WBT-100/200 GPS Download") -QT_TRANSLATE_NOOP("core","Wintec WBT-201/G-Rays 2 Binary File Format") -QT_TRANSLATE_NOOP("core","Appends the input to a backup file") -QT_TRANSLATE_NOOP("core","Only waypoints that are not the backup file") -QT_TRANSLATE_NOOP("core","XAiOX iTrackU Logger") -QT_TRANSLATE_NOOP("core","Appends the input to a backup file") -QT_TRANSLATE_NOOP("core","Only waypoints that are not the backup file") -QT_TRANSLATE_NOOP("core","XAiOX iTrackU Logger Binary File Format") diff --git a/gui/coretool/gpsbabel_de.qm b/gui/coretool/gpsbabel_de.qm index 35ffebf6c..fea44efda 100644 Binary files a/gui/coretool/gpsbabel_de.qm and b/gui/coretool/gpsbabel_de.qm differ diff --git a/gui/coretool/gpsbabel_de.ts b/gui/coretool/gpsbabel_de.ts index 0904b7b38..3252e9f6f 100644 --- a/gui/coretool/gpsbabel_de.ts +++ b/gui/coretool/gpsbabel_de.ts @@ -4,7 +4,7 @@ core - + (integer sec or 'auto') Barograph to GPS time diff Zeitdifferent zwischen Barograph und GPS (ganzz. Sekunden oder 'auto') @@ -25,51 +25,29 @@ Icon allgemein fÃŧr "offen" - + After output job done sleep n second(s) Im Anschluß n Sekunde(n) pausieren - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + Allow whitespace synth. shortnames Leerzeichen in Kurznamen erlauben - + Altitudes are absolute and not clamped to ground Absolute HÃļhenangaben (nicht bodenverbunden) @@ -78,55 +56,33 @@ Beschreibung um Symbolbeschreibung erweitern - + Append realtime positioning data to the output file instead of truncating Echtzeit-Positionierungsdaten an Ausgabendatei anhängen und nicht kÃŧrzen - + Base URL for link tag in output Basis-URL fÃŧr VerknÃŧpfungseintrag in Ausgabe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Basename prepended to URL on output Basis-Adresse fÃŧr erzeugte URLs - - + + Bitmap of categories Mehrfachkategorie, als Dezimal- oder Hexadezimalwert @@ -135,7 +91,7 @@ Kategoriename (Cache) - + Category number to use for written waypoints Kategorienummer (1..16) beim Schreiben von Wegpunkten verwenden @@ -144,23 +100,22 @@ Farbe fÃŧr Linien oder Kartenangaben - - + Command unit to power itself down Gerät im Anschluß abschalten - + Complete date-free tracks with given date (YYYYMMDD). Tracks ohne Datumsangaben mit diesem Datum vervollständigen (YYYYMMDD) - + Create unique waypoint names (default = yes) Eindeutige Wegpunktnamen erzeugen (Vorgabe: JA) - + Create waypoints from geocache log entries Wegpunkte aus Geocache Log-Einträgen erzeugen @@ -173,7 +128,7 @@ Datenbankname (Dateiname) - + Datum (default=NAD27) GPS-Datum (Vorgabe: NAD27) @@ -182,79 +137,70 @@ Anzahl an Tagen, nach denen Punkte als alt betrachtet werden - + Decimal seconds to pause between groups of strings Pause (in Sekunden) zwischen Zeilengruppen - + Default category on output Standardkategorie beim Schreiben - + Default category on output (1..16) Standardkategorie der Ausgabe (1..16) - - - - - - + + + Default icon name Standard Symbol - Default location - Vorgabestandort + Vorgabestandort - + Default proximity Vorgabe-Annäherungsabstand - + Default speed Standardgeschwindigkeit - Default speed for waypoints (knots/hr) - Vorgabegeschwindigkeit fÃŧr Wegpunkte (Knoten/h) + Vorgabegeschwindigkeit fÃŧr Wegpunkte (Knoten/h) - - + + Degrees output as 'ddd', 'dmm'(default) or 'dms' Schreibe Gradangaben in 'ddd', 'dmm' (Vorgabe) oder 'dms' (Gitter) - Delete all routes - Alle Routen lÃļschen + Alle Routen lÃļschen - Delete all track points - Alle Trackpunkte lÃļschen + Alle Trackpunkte lÃļschen - - Delete all waypoints - Alle Wegpunkte lÃļschen + Alle Wegpunkte lÃļschen - + Display labels on track and routepoints (default = 1) Beschriftung bei Track- und Routenpunkten anzeigen (Vorgabe: 1) - + Distance unit [m=metric, s=statute] Entfernungsangaben [m=Metrisch, s=Statute] @@ -267,29 +213,29 @@ Keine URLs zur Beschreibung hinzufÃŧgen - + Don't show gpi bitmap on device Kein Bitmap (Icon) auf dem GPS anzeigen - + Draw extrusion line from trackpoint to ground Verbindungslinie vom Trackpunkt zum Erdboden zeichnen - + Drop route points that do not have an equivalent waypoint (hidden points) Versteckte Wegpunkte lÃļschen (automatisch berechnete Routenpunkte) - + Enable alerts on speed or proximity distance Alarm fÃŧr Annäherung oder Geschwindigkeit aktivieren - - - + + + Encrypt hints using ROT13 VerschlÃŧsselung mit ROT13 @@ -298,24 +244,22 @@ VerschlÃŧsselung mit ROT13 - - - - - - - - + + + + + + Erase device data after download Nachdem Download Daten auf dem Gerät lÃļschen - + Export linestrings for tracks and routes Linendaten (linestrings) fÃŧr Tracks und Routen exportieren (Vorgabe: JA) - + Export placemarks for tracks and routes Markierungen fÃŧr Tracks und Routen exportieren @@ -338,39 +282,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + GPS datum (def. WGS 84) GPS-Datum (Vorgabe: WGS 84) @@ -383,25 +305,24 @@ Ereignis-Symbole beim Lesen ignorieren - + Include extended data for trackpoints (default = 1) Erweiterte Daten in Trackpoints mit einbeziehen (Vorgabe = 1) - - + + Include groundspeak logs if present Groundspeak Logs beifÃŧgen (sofern vorhandan) - + Include major turn points (with description) from calculated route Hauptrichtungsänderungen (Ansage vorhanden) mit einbeziehen - Include only via stations in route - Nur Stationspunkte ('via stations') der Route Ãŧbernehmen + Nur Stationspunkte ('via stations') der Route Ãŧbernehmen Include short name in bookmarks @@ -416,30 +337,27 @@ Routen-Index (falls mehrere im Eingabeformat) - Index of route to write (if more than one in source) - Zu Schreibender Routen-Index (falls mehrere im Eingabeformat) + Zu Schreibender Routen-Index (falls mehrere im Eingabeformat) Index of route/track to write (if more than one in source) Routen- oder Track-Index (falls mehrere im Eingabeformat) - Index of track (if more than one in source) - Track-Index (falls mehrere im Eingabeformat) + Track-Index (falls mehrere im Eingabeformat) - Index of track to write (if more than one in source) - Track-Index (falls mehrere im Eingabeformat) + Track-Index (falls mehrere im Eingabeformat) Index of URL field in .dbf Index der URL innerhalb der .dbf - + Indicate direction of travel in track icons (default = 0) Bewegungsrichtung in Tracksymbolen mit Richtungspfeilen anzeigen (Vorgabe: 0) @@ -452,95 +370,50 @@ Icon "Komplex (Infrastruktur) offen" - Keep turns if simplify filter is used - Abbiegungen bei Verwendung des Simplify(Vereinfachen)-Filters beibehalten + Abbiegungen bei Verwendung des Simplify(Vereinfachen)-Filters beibehalten - - + + Length of generated shortnames Maximale Länge der generierten Kurznamen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Max synthesized shortname length Length of generated shortnames (default 16) Maximale Länge der zu generierenden Kurznamen (Vorgabe: 16) - + Line color, specified in hex AABBGGRR Linienfarbe (hexadezimaler Wert AABBGGRR) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Make synth. shortnames unique Eindeutige Kurznamen erzeugen @@ -549,17 +422,17 @@ TRK-Datei in MapSend-Version # (3,4) erzeugen - + Video position for which exact GPS time is known (hhmmss[.sss], default is 00:00:00,000) - + GPS time at position video_time (hhmmss[.sss], default is first timestamp of track) - + GPS date at position video_time (yyyymmdd, default is first timestamp of track) @@ -580,68 +453,27 @@ Markierungstyp fÃŧr nicht gefundene Punkte - + Max length of waypoint name to write Max. Länge der zu schreibenden Wegpunktnamen - - - Max number of comments to write (maxcmts=200) - Maximale Anzahl an Kommentaren fÃŧr die Ausgabe + Maximale Anzahl an Kommentaren fÃŧr die Ausgabe Max shortname length when used with -s Maximale Länge der generierten Kurznamen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Max synthesized shortname length - Maximale Länge der generierten Kurznamen - Merge output with existing file Ausgabe in existierende Datei einfÃŧgen - - - - + + + + MTK compatible CSV output file Ausgabe-CSV-Datei kompatibel zum MTK-Datalogger @@ -650,16 +482,15 @@ Name der 'unassigned'-Kategorie - New name for the route - Name der neuen Route + Name der neuen Route No separator lines between waypoints Keine Trennlinien zwischen den Wegpunkten - + No whitespace in generated shortnames Leerzeichen in Kurznamen unterdrÃŧcken @@ -672,32 +503,30 @@ Sichtbar und unverschlÃŧsselter Symbolname - Numeric value of bitrate (baud=4800) - Baudrate (Vorgabe: 4800) + Baudrate (Vorgabe: 4800) - + Omit Placer name Placername auslassen - Only read turns; skip all other points - Nur Abbiegungen lesen und alle sonstigen Punkte Ãŧberspringen + Nur Abbiegungen lesen und alle sonstigen Punkte Ãŧberspringen - + Path to HTML style sheet Pfad zum HTML-Stylesheet - + Precision of coordinates Präzision der Koordinaten (Anzahl Nachkommastellen) - + Proximity distance Standardmäßiger Annäherungsabstand @@ -706,57 +535,55 @@ Kreisradius - Radius of our big earth (default 6371000 meters) - Erdradius in Meter (Vorgabe: 6371000 Meter) + Erdradius in Meter (Vorgabe: 6371000 Meter) - Read control points as waypoint/route/none - Lese Kontrollpunkte als Wegpunkt/Route/nichts + Lese Kontrollpunkte als Wegpunkt/Route/nichts Read/Write date format (i.e. DDMMYYYY) Datumsformat fÃŧr Ein-/Ausgabe (z.B. DDMMYYYY) - + Read/Write date format (i.e. yyyy/mm/dd) Datumsformat (z.B. DD.MM.YYYY) - + Read/write GPGGA sentences Schreibe/Lese GPGGA Sequenzen - + Read/write GPGSA sentences Schreibe/Lese GPGSA Sequenzen - + Read/write GPRMC sentences Schreibe/Lese GPRMC Sequenzen - + Read/write GPVTG sentences Schreibe/Lese GPVTG Sequenzen - + Read/Write time format (i.e. HH:mm:ss xx) Zeitformat (z.B. HH:mm:ss xx) - + Retain at most this number of position points (0 = unlimited) HÃļchstens diese Anzahl an Positionspunkten behalten (0 = keine Begrenzung) - - + + Return current position as a waypoint Aktuelle Position als Wegpunkt Ãŧbertragen @@ -769,72 +596,63 @@ Kurzname ergibt sich aus MAC-Adresse - + Speed in bits per second of serial port (baud=4800) Übertragungsrate des seriellen Ports in Bits/Sekunde (Vorgabe: baud=4800) - Split input into separate files - Gelesene Daten in einzelne Dateien aufteilen + Gelesene Daten in einzelne Dateien aufteilen - Split into multiple routes at turns - Route an Abbiegungen teilen + Route an Abbiegungen teilen Garmin Training Center Garmin Training Center - + Write course rather than history, default yes Kurs statt Verlauf schreiben (Vorgabe: ja) - + Sport: Biking (deflt), Running, MultiSport, Other Sport: Radfahren, Laufen, Mehrere Sportarten, Andere - Geogrid-Viewer ascii overlay file (.ovl) - Geogrid-Viewer ASCII Overlay-Datei (.ovl) + Geogrid-Viewer ASCII Overlay-Datei (.ovl) - Geogrid-Viewer tracklogs (.log) - Geogrid-Viewer Tracklogs (.log) + Geogrid-Viewer Tracklogs (.log) The minimum speed (km/h) traveling from waypoint to waypoint. Set >0 to remove duplicate waypoints Minimalgeschwindigkeit (km/h) bei Bewegung von einem Wegpunkt zum nächsten. GrÃļßer Null wählen, um doppelte Wegpunkte zu entfernen. - iGO2008 points of interest (.upoi) - iGO2008 points of interest (.upoi) + iGO2008 points of interest (.upoi) - IGO8 .trk - IGO8 .trk + IGO8 .trk - Track identification number - Track-Identifikationsnummer + Track-Identifikationsnummer - Track title - Tracktitel + Tracktitel - Track description - Trackbeschreibung + Trackbeschreibung Starting seed of the internal number generator @@ -853,96 +671,100 @@ Unsichtbarer unverschlÃŧsselter Symbolname - + Set location finder target location as lat,lng - + Configure logging parameter as tmin:tmax:dmin:dmax - - - + + + Seconds that GPS time tracks UTC (0: best guess) - - - + + Image Offset Time (+HH:MM or -HH:MM) + + + + + override codec to use for device + + + + + Google Takeout Location History + + + + + + GPS week rollover period we're in (-1: best guess) - + codec to use for reading and writing strings (default windows-1252) - + Qstarz BL-1000 - + SkyTraq Venus based loggers (download) - + First sector to be read from the file - + Last sector to be read from the file (-1: read till empty sector) - + SkyTraq Venus based loggers Binary File Format - + Format for subtitles - + SubRip subtitles for video mapping (.srt) - Swiss Map 25/50/100 (.xol) - Swiss Map 25/50/100 (.xol) + Swiss Map 25/50/100 (.xol) - + Tab delimited fields useful for OpenOffice - - Teletype [ Get Jonathon Johnson to describe - - - - - TomTom Places Itineraries (.itn) - - - - + Write name(s) of format(s) from input session(s) Name(n) der Format(e) der Eingabesitzung(en) ausgeben - + Write filename(s) from input session(s) Dateiname(n) der Eingabesitzung(en) ausgeben @@ -950,11 +772,6 @@ Version of VidaOne file to read or write (1 or 2) Version der zu schreibenden/lesenden VidaOne-Datei (1 oder 2) - - - Wintec TES file - - String to separate concatenated address fields (default=", ") Trennzeichen fÃŧr zusammengefÃŧgte Adressfelder (Vorgabe: ", ") @@ -968,14 +785,13 @@ UnterdrÃŧcke zurÃŧckgezogene (?) Geocaches - + Suppress separator lines between waypoints Keine Trennlinien zwischen den Wegpunkten - Suppress use of handshaking in name of speed - Kein 'Handshaking' (im Namen der Geschwindigkeit) + Kein 'Handshaking' (im Namen der Geschwindigkeit) Suppress whitespace in generated shortnames @@ -986,22 +802,21 @@ Symbol fÃŧr Punkte - + Sync GPS time to computer time Synchronisiere PC-Uhr mit dem GPS (PC -> GPS) - Synthesize track times - Erzeuge Tracknamen + Erzeuge Tracknamen - + Target GPX version for output Schreibe in GPX-Version (1.0 oder 1.1) - + Temperature unit [c=Celsius, f=Fahrenheit] Temperatureinheit [c=Celsius, F=Fahrenheit] @@ -1018,13 +833,13 @@ .an1 Dateityp - - + + Units for altitude (f)eet or (m)etres HÃļhenangaben in Fuß oder Meter ('f' oder 'm') - + Units used for names with @speed ('s'tatute or 'm'etric) Einheit fÃŧr Geschwindigkeit in Wegpunkten [...@30] ( 's'tatute oder 'm'etrisch) @@ -1035,38 +850,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + UPPERCASE synth. shortnames Erzeuge Kurznamen in Großbuchstaben @@ -1081,48 +874,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Use shortname instead of description Kurznamen anstelle der Beschreibung verwenden - + Use specified bitmap on output Gewähltes Bitmap (.BMP) fÃŧr die Ausgabe verwenden - + Version of gdb file to generate (1..3) Schreibe GDB-Version 1, 2 oder 3 @@ -1131,12 +901,12 @@ Schreibe MapSource Datei in Version ... (3,4 oder 5) - + Waypoint background color Wegpunkt Hintergrundfarbe - + Waypoint foreground color Wegpunkt Vordergrundfarbe @@ -1149,54 +919,65 @@ Kartenbreite in Pixel - + Width of lines, in pixels LinienhÃļhe in Pixel - + Write additional node tag key/value pairs Zusätzliche Wegpunkt (node) Informationspaare (tags) schreiben - + Write additional way tag key/value pairs Zusätzliche Routen (way) Informationspaare (tags) schreiben - + Write all tracks into one file Alle Tracks in eine Datei schreiben - + Write description to address field Beschreibung in das Adressfeld schreiben - + Write each waypoint in a separate file Jeden Wegpunkt in eine separate Datei schreiben - + Write notes to address field Kommentar (Notizen) in das Adressfeld schreiben - + Write position to address field Koordinaten in das Adressfeld schreiben - - + + Write position using this grid. Koordinaten unter Benutzung dieses Gitters (Grids) erzeugen. - - + + + + + + + + + + + + + Write timestamps with offset x to UTC time Zeitstempel mit Versatz x zur UTC schreiben @@ -1205,7 +986,7 @@ Tracks ohne Titel erzeugen (kompatibel zu "Carto Exploreur") - + Write tracks for Gisteq Phototracker Tracks fÃŧr "Gisteq Phototracker" schreiben @@ -1222,14 +1003,12 @@ Alan Map500 Wegpunkte und Routen (.wpr) - Brauniger IQ Series Barograph Download - Brauniger IQ Series Barograph Download + Brauniger IQ Series Barograph Download - Cambridge/Winpilot glider software - Cambridge/Winpilot glider Software + Cambridge/Winpilot glider Software CarteSurTable data file @@ -1244,12 +1023,12 @@ CoastalExplorer XML - + Columbus/Visiontac V900 files (.csv) Columbus/Visiontac V900 Datei (.csv) - + Comma separated values Kommaseparierte Werte @@ -1266,7 +1045,7 @@ cotoGPS fÃŧr Palm/OS - + Data Logger iBlue747 csv Data Logger iBlue747 (.csv) @@ -1279,9 +1058,8 @@ DeLorme .an1 (drawing) Datei - DeLorme GPL - DeLorme GPL + DeLorme GPL DeLorme PN-20/PN-30/PN-40 USB protocol @@ -1296,14 +1074,12 @@ Unabhängig von PN-Version lange Wegpunkte verwenden - DeLorme Street Atlas Plus - DeLorme PN-20/PN-30/PN-40 USB protocol + DeLorme PN-20/PN-30/PN-40 USB protocol - DeLorme Street Atlas Route - DeLorme Street Atlas Route + DeLorme Street Atlas Route DeLorme XMap HH Native .WPT @@ -1318,136 +1094,113 @@ DeLorme XMat HH Street Atlas USA .WPT (PPC) - Destinator Itineraries (.dat) - Destinator Reiserouten (.dat) + Destinator Reiserouten (.dat) - Destinator Points of Interest (.dat) - Destinator Points of Interest (.dat) + Destinator Points of Interest (.dat) - Destinator TrackLogs (.dat) - Destinator TrackLogs (.dat) + Destinator TrackLogs (.dat) - EasyGPS binary format - EasyGPS Binärformat + EasyGPS Binärformat - + Embedded Exif-GPS data (.jpg) Eingebettete EXIF-GPS-Daten (.jpg) - + Set waypoint name to source filename Wegpunktnamen nach Eingabedatei benennen - + Data Logger iBlue757 csv Data Logger iBlue747 (.csv) {757 ?} - + Time-frame (in seconds) Zeit-Frame (in Sekunden) - + Locate waypoint for tagging by this name Wegpunkt fÃŧr Tagging mit diesem Namen auffinden - + !OVERWRITE! the original file. Default=N Originaldatei !ÜBERSCHREIBEN!. Standard=N - - Energympro GPS training watch - - - - Enigma binary waypoint file (.ert) - Enigma binäre Wegpunkt-Datei (.ert) + Enigma binäre Wegpunkt-Datei (.ert) - + Source for name field in .dbf - + Source for URL field in .dbf - + ESRI shapefile - - F90G Automobile DVR GPS log file - - - - + FAI/IGC Flight Recorder Data Format FAI/IGC Flight Recorder Datenformat - + Read all points even if latitude or longitude is missing - + Flexible and Interoperable Data Transfer (FIT) Activity file - - FlySight GPS File - - - - Franson GPSGate Simulation - Franson GPSGate Simulation + Franson GPSGate Simulation - Fugawi - Fugawi + Fugawi G7ToWin data files (.g7t) G7ToWin Datendatei (.g7t) - + Garmin 301 Custom position and heartrate Garmin 301 Custom Position und Herzfrequenz - + Garmin G1000 datalog input filter file - Garmin Logbook XML - Garmin Logbook XML + Garmin Logbook XML - + Garmin MapSource - gdb Garmin MapSource - gdb @@ -1456,7 +1209,7 @@ Garmin MapSource - mps - + Garmin MapSource - txt (tab delimited) Garmin MapSource - txt (Tabulator getrennt) @@ -1465,47 +1218,47 @@ Garmin PCX5 - + Garmin POI database Garmin POI-Datenbank - + codec to use for writing strings - + language code to use for reading dual language files - + Garmin Points of Interest (.gpi) Garmin Points of Interest (.gpi) - + Erase existing courses when writing new ones - + Speed in bits per second of serial port (baud=9600) Übertragungsrate des seriellen Ports in Bits/Sekunde (Vorgabe: baud=4800) {9600)?} - + Garmin serial/USB protocol Garmin Serielles/USB-Protokoll - + Garmin Training Center (.tcx/.crs/.hst/.xml) - + Geocaching.com .loc Geocaching.com .loc @@ -1514,29 +1267,28 @@ GeocachingDB fÃŧr Palm/OS - GEOnet Names Server (GNS) - GEOnet Names Server (GNS) + GEOnet Names Server (GNS) GeoNiche .pdb GeoNiche .pdb - + GlobalSat DG-100/BT-335 Download GlobalSat DG-100/BT-335 Download - - - - + + + + Only erase device data, do not download anything Nur Gerätedaten lÃļschen, aber nichts herunter laden - + Google Earth (Keyhole) Markup Language Google Earth (Keyhole) Markup Language (.kml) @@ -1545,9 +1297,8 @@ Google Maps XML - Google Navigator Tracklines (.trl) - Google Navigator Tracklines (.trl) + Google Navigator Tracklines (.trl) GoPal GPS track log (.trk) @@ -1566,22 +1317,22 @@ GpilotS - + GPS TrackMaker GPS TrackMaker - + GPSBabel arc filter file GPSBabel arc Filterdatei - + GpsDrive Format GpsDrive Format - + GpsDrive Format for Tracks GpsDrive Format fÃŧr Tracks @@ -1598,44 +1349,41 @@ gpsutil - + GPX XML GPX XML - + Add info (depth) as Humminbird extension Information (Tiefe) als Humminbird-Erweiterung hinzufÃŧgen - + Add info (depth) as Garmin extension Information (Tiefe) als Garminerweiterung hinzufÃŧgen - HikeTech - HikeTech + HikeTech - Holux (gm-100) .wpo Format - Holux (gm-100) .wpo Format + Holux (gm-100) .wpo Format - + Holux M-241 (MTK based) Binary File Format Holux M-241 (MTK basiert) Binärdatei - + Holux M-241 (MTK based) download Holux M-241 (MTK basiert) Download - - - + + Enable logging after download Logging nach dem Download aktivieren @@ -1648,24 +1396,23 @@ HSA Endeavour Navigator Export - + HTML Output HTML Ausgabe - + Humminbird tracks (.ht) Humminbird Tracks (.ht) - + Humminbird waypoints and routes (.hwr) Humminbird Wegpunkte und Routen (.hwr) - IGN Rando track files - IGN Rando Trackdatei + IGN Rando Trackdatei Kartex 5 Track File @@ -1676,26 +1423,24 @@ Kartex 5 Wegpunktdatei - Kompass (DAV) Track (.tk) - Kompass (DAV) Track (.tk) + Kompass (DAV) Track (.tk) - Kompass (DAV) Waypoints (.wp) - Kompass (DAV) Wegpunkte (.wp) + Kompass (DAV) Wegpunkte (.wp) KuDaTa PsiTrex text KuDaTa PsiTrex Text - + Lowrance USR Lowrance USR - + (USR output) Write version (USR Ausgabe) Write version @@ -1712,68 +1457,56 @@ Magellan NAV Companion fÃŧr Palm/OS - Magellan SD files (as for eXplorist) - Magellan SD files (fÃŧr eXplorist) + Magellan SD files (fÃŧr eXplorist) - Magellan SD files (as for Meridian) - Magellan SD files (fÃŧr Meridian) + Magellan SD files (fÃŧr Meridian) - Magellan serial protocol - Magellan serielles Protokoll + Magellan serielles Protokoll - MagicMaps IK3D project file (.ikt) - MagicMaps IK3D Projektdatei (.ikt) + MagicMaps IK3D Projektdatei (.ikt) - Map&Guide 'TourExchangeFormat' XML - Map&Guide 'TourExchangeFormat' XML + Map&Guide 'TourExchangeFormat' XML Map&Guide to Palm/OS exported files (.pdb) Map&Guide nach Palm/OS exportierte Datei (.pdb) - MapAsia track file (.tr7) - MapAsia Trackdatei (.tr7) + MapAsia Trackdatei (.tr7) - Mapopolis.com Mapconverter CSV - Mapopolis.com Mapconverter CSV + Mapopolis.com Mapconverter CSV - MapTech Exchange Format - MapTech Exchange Format + MapTech Exchange Format - Memory-Map Navigator overlay files (.mmo) - Memory-Map Navigator Overlay-Datei (.mmo) + Memory-Map Navigator Overlay-Datei (.mmo) - Write items 'locked' [default no] - Element 'locked' schreiben [Standard nein] + Element 'locked' schreiben [Standard nein] - Write items 'visible' [default yes] - Element 'visible' schreiben [Standard ja] + Element 'visible' schreiben [Standard ja] - Write files with internal version [n] - Dateien mit interner Version schreiben [n] + Dateien mit interner Version schreiben [n] Microsoft AutoRoute 2002 (pin/route reader) @@ -1784,41 +1517,39 @@ Microsoft Streets and Trips (pin/route reader) - Microsoft Streets and Trips 2002-2007 - Microsoft Streets and Trips 2002-2007 + Microsoft Streets and Trips 2002-2007 - Motorrad Routenplaner (Map&Guide) .bcr files - Motorrad Routenplaner (Map&Guide) (.bcr) + Motorrad Routenplaner (Map&Guide) (.bcr) MS PocketStreets 2002 Pushpin MS PocketStreets 2002 Pushpin - + MTK Logger (iBlue 747,...) Binary File Format MTK Logger (iBlue 747,...) Binärdatei - + MTK Logger (iBlue 747,Qstarz BT-1000,...) download MTK Logger (iBlue 747,Qstarz BT-1000,...) Download - + National Geographic Topo .tpg (waypoints) National Geographic Topo .tpg (Wegpunkte) - + National Geographic Topo 2.x .tpo National Geographic Topo 2.x .tpo - + National Geographic Topo 3.x/4.x .tpo National Geographic Topo 3.x/4.x .tpo @@ -1831,34 +1562,28 @@ Navigon Mobile Navigator .rte-Datei - Navigon Waypoints - Navigon Wegpunkte + Navigon Wegpunkte - NaviGPS GT-11/BGT-11 Download - NaviGPS GT-11/BGT-11 Download + NaviGPS GT-11/BGT-11 Download - Clear the datalog - Datalog lÃļschen + Datalog lÃļschen - Read from datalogger buffer - Datalogger-Puffer auslesen + Datalogger-Puffer auslesen - NaviGPS GT-31/BGT-31 datalogger (.sbp) - NaviGPS GT-31/BGT-31 Datalogger (.sbp) + NaviGPS GT-31/BGT-31 Datalogger (.sbp) - NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) - NaviGPS GT-31/BGT-31 SiRF binäre Logdatei (.sbn) + NaviGPS GT-31/BGT-31 SiRF binäre Logdatei (.sbn) Naviguide binary route file (.twl) @@ -1869,330 +1594,260 @@ 'wp' - Wegpunktdatei erstellen, 'rte' - Routendatei erstellen - - + Time zone ID - + Attempt to recovery data from corrupt file - + Don't create waypoints for non-user points - - Geogrid-Viewer binary overlay file (.ovl) - - - - + Compact Output. Default is off. - + GeoJson - + GlobalSat DG-200 Download - + list tracks - + get track - - - - + + + + Dump raw data to this file - + GlobalSat GH625XT GPS training watch - - Google Directions XML - - - - + Write KML track (default = 0) - + Units used when writing comments ('s'tatute, 'm'etric,' 'n'autical, 'a'viation) - + Rotate colors for tracks and routes (default automatic) - + Precision of coordinates, number of decimals - + GPS Tracking Key Pro text - + Precision of elevations, number of decimals - - + + Size of blocks in KB to request from device - - iGo Primo points of interest (.upoi) - - - - + (USR input) Ignore event marker icons on read - + (USR output) Treat waypoints as icons on write - + (USR output) Merge into one segmented trail - + (USR input) Break segments into separate trails - + (USR output) Output file title string - + (USR output) Device serial number - + (USR output) Output file content description - - Mainnav - - - - - Mapbar (China) navigation track for Sonim Xp3300 - - - - - Mapfactor Navigator - - - - - Speed in bits per second of serial port (autodetect=0) - - - - - Download logged fixes - - - - - Show device status - - - - - MediaTek Locus - - - - - + + First sector to be read from the device - - + + Baud rate used to init device (0=autodetect) - - + + Last sector to be read from the device (-1: smart read everything) - - + + Disable output (useful with erase) - - + + Number of sectors to read at once (0=use single sector mode) - + POI for Home Symbol as lat:lng[:alt] - + POI for Car Symbol as lat:lng[:alt] - + POI for Boat Symbol as lat:lng[:alt] - + POI for Heart Symbol as lat:lng[:alt] - + POI for Bar Symbol as lat:lng[:alt] - + MiniHomer, a skyTraq Venus 6 based logger (download tracks, waypoints and get/set POI) - + Garmin Mobile XT ([ATRK]/STRK) - + Track name processing option ([0]-nrm/1-ign) - + Mobile Garmin XT Track files - - - Motoactiv CSV - - - - - MyNav TRC format - - 'n' - Keep the existing wp name, 'y' - rename waypoints 'n' - Existierende Wegpunktnamen behalten, 'y' - Wegpunkte umbenennen - Navitel binary track (.bin) - Navitel binäre Trackdatei (.bin) + Navitel binäre Trackdatei (.bin) - Navitrak DNA marker format - Navitrak DNA marker format + Navitrak DNA marker format NetStumbler Summary File (text) NetStumbler Summary File (text) - NIMA/GNIS Geographic Names File - NIMA/GNIS Geographic Names File + NIMA/GNIS Geographic Names File - + Accept position fixes in gpgga marked invalid - + NMEA 0183 sentences NMEA 0183 Sätze - - Compact binary representation - - - - Nokia Landmark Exchange - Nokia Landmark Exchange + Nokia Landmark Exchange - + OpenStreetMap data files OpenStreetMap Datendatei (.osm) - + Use this value as custom created_by value Diesen Wert als eigenen Wert fÃŧr created_by verwenden - + OziExplorer OziExplorer - + Unit used in altitude values Einheit fÃŧr HÃļhenwerte - + Unit used in proximity values Einheit fÃŧr Entfernungswerte @@ -2225,19 +1880,16 @@ Quovadis - Raymarine Waypoint File (.rwf) - Raymarine Wegpunktdatei (.rwf) + Raymarine Wegpunktdatei (.rwf) - Ricoh GPS Log File - Ricoh GPS Logdatei + Ricoh GPS Logdatei - See You flight analysis data - You flight Analysedaten anzeigen + You flight Analysedaten anzeigen Skymap / KMD150 ascii files @@ -2252,8 +1904,8 @@ Baudrate fÃŧr die Geräteinitialisierung, 0=automatische Erkennung - - + + Baud rate used for download Baudrate fÃŧr das Herunterladen @@ -2278,45 +1930,41 @@ Tabulator-getrennte Felder (nÃŧtzlich fÃŧr OpenOffice, Ploticus etc.) - + Textual Output Textausgabe - TomTom Itineraries (.itn) - TomTom Reiserouten (.itn) + TomTom Reiserouten (.itn) - TomTom POI file (.asc) - TomTom POI-Datei (.asc) + TomTom POI-Datei (.asc) - TomTom POI file (.ov2) - TomTom POI-Datei (.ov2) + TomTom POI-Datei (.ov2) TopoMapPro Places File TopoMapPro Places-Datei - TrackLogs digital mapping (.trl) - TrackLogs digital mapping (.trl) + TrackLogs digital mapping (.trl) U.S. Census Bureau Tiger Mapping Service U.S. Census Bureau Tiger Mapping Service - + Universal csv with field structure in first line Universelle CSV-Datei mit Feldstruktur in der ersten Zeile - + Vcard Output (for iPod) VCard-Ausgabe (fÃŧr iPod) @@ -2337,41 +1985,32 @@ WiFiFoFum 2.0 fÃŧr PocketPC XML - Wintec WBT-100/200 Binary File Format - Wintec WBT-100/200 Binärdatei + Wintec WBT-100/200 Binärdatei - Wintec WBT-100/200 GPS Download - Wintec WBT-100/200 GPS Download + Wintec WBT-100/200 GPS Download - Wintec WBT-201/G-Rays 2 Binary File Format - Wintec WBT-201/G-Rays 2 Binärdatei + Wintec WBT-201/G-Rays 2 Binärdatei - XAiOX iTrackU Logger - XAiOX iTrackU Logger + XAiOX iTrackU Logger - - Appends the input to a backup file - Eingabe an Sicherungsdatei anhängen + Eingabe an Sicherungsdatei anhängen - - Only waypoints that are not the backup file - Nur Wegpunkte, die keine Sicherungsdatei sind + Nur Wegpunkte, die keine Sicherungsdatei sind - XAiOX iTrackU Logger Binary File Format - XAiOX iTrackU Logger Binärdatei + XAiOX iTrackU Logger Binärdatei Yahoo Geocode API data diff --git a/gui/coretool/gpsbabel_es.qm b/gui/coretool/gpsbabel_es.qm index 692bbbd39..8cdd630a4 100644 Binary files a/gui/coretool/gpsbabel_es.qm and b/gui/coretool/gpsbabel_es.qm differ diff --git a/gui/coretool/gpsbabel_es.ts b/gui/coretool/gpsbabel_es.ts index 0c3dd7f20..1601bdb07 100644 --- a/gui/coretool/gpsbabel_es.ts +++ b/gui/coretool/gpsbabel_es.ts @@ -10,267 +10,112 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Max synthesized shortname length Longitud mÃĄxima del nombre corto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + Allow whitespace synth. shortnames Permitir espacios en nombres cortos - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + UPPERCASE synth. shortnames MAYÚSCULAS en nombres cortos - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Make synth. shortnames unique Hacer los nombres cortos Ãēnicos - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Basename prepended to URL on output Prefijo aÃąadido a la URL en la salida - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Use shortname instead of description Usar nombre corto en lugar de descripciÃŗn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + GPS datum (def. WGS 84) GPS datum (def. WGS 84) @@ -283,14 +128,12 @@ Puntos de interÊs y rutas Alan Map500 (.wpr) - Brauniger IQ Series Barograph Download - Descarga de Brauniger IQ Series Barograph + Descarga de Brauniger IQ Series Barograph - Cambridge/Winpilot glider software - Cambridge/Winpilot glider software + Cambridge/Winpilot glider software CarteSurTable data file @@ -313,12 +156,12 @@ CoastalExplorer XML - + Columbus/Visiontac V900 files (.csv) Ficheros Columbus/Visiontac V900 (.csv) - + Comma separated values Fichero separado por comas (CSV) @@ -327,12 +170,9 @@ Ficheros CompeGPS (.wpt/.trk/.rte) - - - - - - + + + Default icon name Nombre de la imagen por defecto @@ -344,45 +184,6 @@ Give points (waypoints/route points) a default radius (proximity) Dar a los puntos (puntos de interes, puntos de ruta) un radio de proximidad por defecto - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Max synthesized shortname length - Length of generated shortnames (default 16) - Longitud de los nombres cortos generados (16 por defecto) - CoPilot Flight Planner for Palm/OS CoPilot Flight Planner para Palm/OS @@ -396,7 +197,7 @@ Nombre de la categoría "no asignado" - + Data Logger iBlue747 csv Data Logger iBlue747 csv @@ -445,9 +246,8 @@ Radio para círculos - DeLorme GPL - DeLorme GPL + DeLorme GPL DeLorme PN-20/PN-30/PN-40 USB protocol @@ -462,44 +262,33 @@ Usar notas largas en los puntos de interÊs independientemente de la versiÃŗn PN - DeLorme Street Atlas Plus - DeLorme Street Atlas Plus + DeLorme Street Atlas Plus - DeLorme Street Atlas Route - DeLorme Street Atlas Route + DeLorme Street Atlas Route - Keep turns if simplify filter is used - Preservar los giros si el filtro simplificar es usado + Preservar los giros si el filtro simplificar es usado - + Data Logger iBlue757 csv Data Logger iBlue747 csv {757 ?} - Only read turns; skip all other points - Leer sÃŗlo giros, saltar el resto de puntos - - - - Split into multiple routes at turns - + Leer sÃŗlo giros, saltar el resto de puntos - Read control points as waypoint/route/none - Leer los puntos de control como puntos de interÊs/ruta/ninguno + Leer los puntos de control como puntos de interÊs/ruta/ninguno - Synthesize track times - Calcular los tiempos del trazado + Calcular los tiempos del trazado DeLorme XMap HH Native .WPT @@ -514,55 +303,50 @@ DeLorme XMat HH Street Atlas USA .WPT (PPC) - Destinator Itineraries (.dat) - Itinerarios Destinator (.dat) + Itinerarios Destinator (.dat) - Destinator Points of Interest (.dat) - Puntos de interÊs Destinator (.dat) + Puntos de interÊs Destinator (.dat) - Destinator TrackLogs (.dat) - Trazadis Destinator (.dat) + Trazadis Destinator (.dat) - EasyGPS binary format - Formato binario EasyGPS + Formato binario EasyGPS - + Embedded Exif-GPS data (.jpg) Metadatos Exif-GPS (.jpg) - + Set waypoint name to source filename No estoy seguro Poner el nombre del punto de interÊs al fichero fuente - + Time-frame (in seconds) Secuencia (en segundos) - + Locate waypoint for tagging by this name Localizar el punto de interÊs para etiquetar con este nombre - + !OVERWRITE! the original file. Default=N ÂĄSeguro! que quieres sobreescribir el fichero original. Por defecto=N - Enigma binary waypoint file (.ert) - Fichero binario de puntos de interÊs (.ert) + Fichero binario de puntos de interÊs (.ert) Index of name field in .dbf @@ -573,77 +357,72 @@ Indice del campo URL en .dbf - + FAI/IGC Flight Recorder Data Format Formato de datos FAI/IGC Flight Recorder - + (integer sec or 'auto') Barograph to GPS time diff (entero seg o 'auto') Barograph a GPS tiempo diff - Franson GPSGate Simulation - SimulaciÃŗn Franson GPSGate + SimulaciÃŗn Franson GPSGate - Default speed for waypoints (knots/hr) - Velocidad por defecto para puntos de interÊs (nudos) + Velocidad por defecto para puntos de interÊs (nudos) - Split input into separate files - Dividir en ficheros separados + Dividir en ficheros separados - Fugawi - Fugawi + Fugawi G7ToWin data files (.g7t) Ficheros de datos G7ToWin - + Garmin 301 Custom position and heartrate LocalizaciÃŗn y frecuencia de latido Garmin 301 personalizado - Garmin Logbook XML - Garmin Logbook XML + Garmin Logbook XML - + Garmin MapSource - gdb Garmin MapSource - gdb - + Default category on output (1..16) Categoría por defecto en la salida (1..16) - - + + Bitmap of categories Bitmap de categorías - + Version of gdb file to generate (1..3) VersiÃŗn del fichero gdb a generar (1..3) - + Drop route points that do not have an equivalent waypoint (hidden points) Eliminar puntos de ruta que no tienen un punto de interÊs equivalente (puntos ocultos) - + Include major turn points (with description) from calculated route Incluir giros importantes (con descripciÃŗn) de la ruta calculada @@ -652,8 +431,8 @@ Garmin MapSource - mps - - + + Length of generated shortnames Longitud de los nombres cortos generados @@ -674,44 +453,55 @@ Usar valores de proximidad en el resultado (por defecto se ignoran) - + Garmin MapSource - txt (tab delimited) Garmin MapSource - txt (delimitado por tabuladores) - + Read/Write date format (i.e. yyyy/mm/dd) Leer/Escribir el formato de la fecha (por ejemplo aaaa/mm/dd) - + Distance unit [m=metric, s=statute] Unidades de distancia [m=mÊtricas, s=statute] - - + + Write position using this grid. Escribir la posiciÃŗn usando esta cuadrícula. - + Precision of coordinates PrecisiÃŗn de las coordenadas - + Temperature unit [c=Celsius, f=Fahrenheit] Unidad de temperatura [c=Celsius, f=Fahrenheit] - + Read/Write time format (i.e. HH:mm:ss xx) Leer/Escribir el formato de la hora (por ejemplo HH:mm:ss xx) - - + + + + + + + + + + + + + Write timestamps with offset x to UTC time Escribir marcas de tiempo con un retraso de x a UTC @@ -724,164 +514,153 @@ Escribir trazados compatibles con Carto Exploreur - + Garmin POI database Base de datos Garmin POI (Puntos de InterÊs) - + Garmin Points of Interest (.gpi) Puntos de interÊs Garmin (.gpi) - + Enable alerts on speed or proximity distance Habilitar alertas sobre la velocidad o la proximidad - - Energympro GPS training watch - - - - + Source for name field in .dbf - + Source for URL field in .dbf - + ESRI shapefile - - F90G Automobile DVR GPS log file - - - - + Read all points even if latitude or longitude is missing - + Flexible and Interoperable Data Transfer (FIT) Activity file - - FlySight GPS File - - - - + Garmin G1000 datalog input filter file - + Use specified bitmap on output Usar bitmap especificado en el resultado - + Default category on output Categoría por defecto en la salida - + Don't show gpi bitmap on device No mostrar gpi bitmap en el dispositivo - + Write description to address field Escribir la descripciÃŗn al campo direcciÃŗn - + Write notes to address field Escribir las notas al campo direcciÃŗn - + Write position to address field Escribir la posiciÃŗn al campo direcciÃŗn - + Default proximity Proximidad por defecto - + After output job done sleep n second(s) DespuÊs de recibir la seÃąal de trabajo realizado, dormir n segundo(s) - + Default speed Velocidad por defecto - + Create unique waypoint names (default = yes) Crear nombres Ãēnicos para los puntos de interÊs (defecto=si) - + Units used for names with @speed ('s'tatute or 'm'etric) Unidades usadas para nombres con @velocidad ('s'tatute p 'm'etricas) - + codec to use for writing strings - + language code to use for reading dual language files - + Erase existing courses when writing new ones - + Speed in bits per second of serial port (baud=9600) Velocidad en bits por segunod del puerto serie (4800 baudios) {9600)?} - + + override codec to use for device + + + + Garmin serial/USB protocol Protocolo serial/USB Garmin - - + + Return current position as a waypoint Devolver la posiciÃŗn actual como un punto de interÊs - - + Command unit to power itself down Mandar apagarse a la unidad de GPS - + Sync GPS time to computer time Sincronizar la hora con el ordenador - + Category number to use for written waypoints NÃēmero de la categoría donde escribir los puntos de interÊs @@ -890,22 +669,22 @@ Centro de Entrenamiento Garmin - + Write course rather than history, default yes Escribir la direcciÃŗn en lugar de la historia, por defecto si - + Sport: Biking (deflt), Running, MultiSport, Other Deporte: Ciclismo(deflt), Correr, MultiDeporte, Otros - + Geocaching.com .loc Geocaching.com .loc - + Omit Placer name Omitir el nombre del lugar @@ -914,19 +693,16 @@ GeocachingDB para Palm/OS - Geogrid-Viewer ascii overlay file (.ovl) - Fichero de Transparencia ascii Geogrid-Viewer (.ovl) + Fichero de Transparencia ascii Geogrid-Viewer (.ovl) - Geogrid-Viewer tracklogs (.log) - Trazados Geogrid-Viewer (.log) + Trazados Geogrid-Viewer (.log) - GEOnet Names Server (GNS) - Servidor de TopÃŗnimos GEOnet (GNS) + Servidor de TopÃŗnimos GEOnet (GNS) GeoNiche .pdb @@ -941,72 +717,70 @@ Nombre de la categoría (CachÊ) - + GlobalSat DG-100/BT-335 Download Bajar GlobalSat DG-100/BT-335 - - - - - - - - + + + + + + Erase device data after download Borrar dispostivio despuÊs de la descarga - - - - + + + + Only erase device data, do not download anything SÃŗlo borrar los datos del dispositivo, no descargar nada - + Google Earth (Keyhole) Markup Language Google Earth (Keyhole) Markup Language KML - + Export linestrings for tracks and routes Exportar cadenas de texto de los trazados y rutas - + Export placemarks for tracks and routes Exportar hitos de los trazados y rutas - + Width of lines, in pixels Achura de las líneas (en píxeles) - + Line color, specified in hex AABBGGRR Color de la línea, en hex AABBGGRR - + Altitudes are absolute and not clamped to ground Las altitudes son absolutas y no estÃĄn pegadas al terreno - + Draw extrusion line from trackpoint to ground Extruir línea desde el trazado hasta el suelo - + Include extended data for trackpoints (default = 1) Incluir datos extendidos para los puntos de trazado (defecto=1) - + Indicate direction of travel in track icons (default = 0) Indicar la direcciÃŗn del viaje con iconos (defecto=0) @@ -1015,12 +789,12 @@ Unidades usadas al escribir los comentarios ('s'tatute p 'm'etricas) - + Display labels on track and routepoints (default = 1) Mostrar etiquetas en los puntos de los trazados y las rutas (defecto= 1) - + Retain at most this number of position points (0 = unlimited) Retener como mÃĄximo este nÃēmero de puntos de posiciÃŗn (0 = ilimitados) @@ -1029,16 +803,15 @@ Google Maps XML - Google Navigator Tracklines (.trl) - Google Navigator Tracklines (.trl) + Google Navigator Tracklines (.trl) GoPal GPS track log (.trk) Trazado GoPal GPS (.trk) - + Complete date-free tracks with given date (YYYYMMDD). Completar trazados con una fecha determinada (AAAAMMDD). @@ -1059,22 +832,22 @@ GpilotS - + GPS TrackMaker GPS TrackMaker - + GPSBabel arc filter file Fichero de filtro arc GPSBabel - + GpsDrive Format Formato GpsDrive - + GpsDrive Format for Tracks Formato GpsDrive para trazados @@ -1091,72 +864,69 @@ gpsutil - + GPX XML GPX XML - + No whitespace in generated shortnames No permitir espacios en nombres cortos generados - + Create waypoints from geocache log entries Crear puntos de interÊs desde las entradas de los trazados geocache - + Base URL for link tag in output URL base para enlazar etiquetas en el resultado - + Target GPX version for output VersiÃŗn GPX del resultado - + Add info (depth) as Humminbird extension AÃąadir info (profundidad) como extensiÃŗn Humminbird - + Add info (depth) as Garmin extension AÃąadir info (profundidad) como extensiÃŗn Garmin - HikeTech - HikeTech + HikeTech - Holux (gm-100) .wpo Format - Formato Holux (gm-100) .wpo + Formato Holux (gm-100) .wpo - + Holux M-241 (MTK based) Binary File Format Formato de fichero binario Holux M-241 (MTK based) - - - - + + + + MTK compatible CSV output file Fichero de salida CSV MTK compatible - + Holux M-241 (MTK based) download Descarga de Holux M-241 (basado en MTK) - - - + + Enable logging after download Habilitar registro despuÊs de la descarga @@ -1169,84 +939,77 @@ Fihero de exportaciÃŗn HSA Endeavour Navigator - + HTML Output Salida a HTML - + Path to HTML style sheet Ruta a la hoja de estilo HTML - - - + + + Encrypt hints using ROT13 Emcriptar trucos usando ROT13 - - + + Include groundspeak logs if present Incluir registros 'groundspeak' si estÃĄn presentes - - + + Degrees output as 'ddd', 'dmm'(default) or 'dms' Salida en grados como 'ddd', 'dmm'(defecto) o 'dms' - - + + Units for altitude (f)eet or (m)etres Unidades de altitud pies (f) o metros (m) - + Humminbird tracks (.ht) Trazados Humminbird (.ht) - + Humminbird waypoints and routes (.hwr) Puntos de interÊs y rutas Humminbird (.hwr) - IGN Rando track files - Trazados IGN Rando + Trazados IGN Rando - Index of track to write (if more than one in source) - Indice del trazado a escribir (si la fuente tiene mÃĄs de uno) + Indice del trazado a escribir (si la fuente tiene mÃĄs de uno) - iGO2008 points of interest (.upoi) - Puntos de interÊs iGO2008 (.upoi) + Puntos de interÊs iGO2008 (.upoi) - IGO8 .trk - IGO8 .trk + IGO8 .trk - Track identification number - Identificador del tratado + Identificador del tratado - Track title - Título del trazado + Título del trazado - Track description - DescripciÃŗn del trazado + DescripciÃŗn del trazado Generate # points @@ -1269,21 +1032,19 @@ Fichero de puntos de interÊs Kartex 5 - Kompass (DAV) Track (.tk) - Trazado Kompass (DAV) (.tk) + Trazado Kompass (DAV) (.tk) - Kompass (DAV) Waypoints (.wp) - Puntos de interÊs Kompass (DAV) (.wp) + Puntos de interÊs Kompass (DAV) (.wp) KuDaTa PsiTrex text Texto KuDaTa PsiTrex - + Lowrance USR Lowrance USR @@ -1304,7 +1065,7 @@ (entrada USR) Dividir los segmentos en trazados separados - + (USR output) Write version (salida USR) Escribir versiÃŗn @@ -1325,97 +1086,77 @@ Magellan NAV Companion para Palm/OS - Magellan SD files (as for eXplorist) - Ficheros Magellan SD (como los del eXplorist) + Ficheros Magellan SD (como los del eXplorist) - - - Max number of comments to write (maxcmts=200) - MÃĄximo nÃēmero de comentarios a escribir (maxcmts=200) + MÃĄximo nÃēmero de comentarios a escribir (maxcmts=200) - Magellan SD files (as for Meridian) - Ficheros Magellan SD (como los del Meridian) + Ficheros Magellan SD (como los del Meridian) - Magellan serial protocol - Protocolo serie Magellan + Protocolo serie Magellan - Numeric value of bitrate (baud=4800) - Valor numÊrico de la conexiÃŗn (baudios=4800) + Valor numÊrico de la conexiÃŗn (baudios=4800) - Suppress use of handshaking in name of speed no sÊ - Suprimir el uso del agitador en nombre de la velocidad + Suprimir el uso del agitador en nombre de la velocidad - - Delete all waypoints - Borrrar todos los puntos de interÊs + Borrrar todos los puntos de interÊs - MagicMaps IK3D project file (.ikt) - Fichero de proyecto MagicMaps IK3D (.ikt) + Fichero de proyecto MagicMaps IK3D (.ikt) - Map&Guide 'TourExchangeFormat' XML - Map&Guide 'TourExchangeFormat' XML + Map&Guide 'TourExchangeFormat' XML - Include only via stations in route - Incluir sÃŗlo a travÊs de las estaciones en la ruta + Incluir sÃŗlo a travÊs de las estaciones en la ruta Map&Guide to Palm/OS exported files (.pdb) Fichero de exportaciÃŗn Map&Guide a Palm/OS (.pdb) - MapAsia track file (.tr7) - Trazado MapAsia (.tr7) + Trazado MapAsia (.tr7) - Mapopolis.com Mapconverter CSV - Mapopolis.com Mapconverter CSV + Mapopolis.com Mapconverter CSV - MapTech Exchange Format - Formato de intercambio MapTech + Formato de intercambio MapTech - Memory-Map Navigator overlay files (.mmo) - Capa de cobertura Memory-Map Navigator + Capa de cobertura Memory-Map Navigator - Write items 'locked' [default no] - Escribir elementos bloqueados [por defecto no] + Escribir elementos bloqueados [por defecto no] - Write items 'visible' [default yes] - Escribir elementos 'visibles' [por defecto si] + Escribir elementos 'visibles' [por defecto si] - Write files with internal version [n] - Escribir ficheros con la versiÃŗn del sistema [n] + Escribir ficheros con la versiÃŗn del sistema [n] Microsoft AutoRoute 2002 (pin/route reader) @@ -1426,62 +1167,57 @@ Microsoft Streets and Trips (lector de puntos y rutas) - Microsoft Streets and Trips 2002-2007 - Microsoft Streets and Trips 2002-2007 + Microsoft Streets and Trips 2002-2007 - Motorrad Routenplaner (Map&Guide) .bcr files - Ficheros Motorrad Routenplaner (Map&Guide) .bcr + Ficheros Motorrad Routenplaner (Map&Guide) .bcr - Index of route to write (if more than one in source) - Indice de la ruta a escribir (si la fuente tiene mÃĄs de uno) + Indice de la ruta a escribir (si la fuente tiene mÃĄs de uno) - New name for the route - Nuevo nombre de la ruta + Nuevo nombre de la ruta - Radius of our big earth (default 6371000 meters) - Radio del planeta tierra (por defecto 6371000 metros) + Radio del planeta tierra (por defecto 6371000 metros) MS PocketStreets 2002 Pushpin MS PocketStreets 2002 Pushpin - + MTK Logger (iBlue 747,...) Binary File Format Formato de fichero binario MTK Logger (iBlue 747,...) - + MTK Logger (iBlue 747,Qstarz BT-1000,...) download Descarga de MTK Logger (iBlue 747,...) - + National Geographic Topo .tpg (waypoints) National Geographic Topo .tpg (Puntos de interÊs) - + Datum (default=NAD27) esta opciÃŗn es buena para AmÊrica del Norte sÃŗlo Datum (default=NAD27, esta opciÃŗn es buena para AmÊrica del Norte sÃŗlo) - + National Geographic Topo 2.x .tpo National Geographic Topo 2.x .tpo - + National Geographic Topo 3.x/4.x .tpo National Geographic Topo 3.x/4.x .tpo @@ -1498,44 +1234,36 @@ Ficheros del Navigon Mobile Navigator .rte - Navigon Waypoints - Puntos de interÊs Navigon + Puntos de interÊs Navigon - NaviGPS GT-11/BGT-11 Download - Descarga de NaviGPS GT-11/BGT-11 + Descarga de NaviGPS GT-11/BGT-11 - Delete all track points - Borrrar todos los puntos del trazado + Borrrar todos los puntos del trazado - Delete all routes - Borrrar todas las rutas + Borrrar todas las rutas - Clear the datalog - Limpiar la memoria + Limpiar la memoria - Read from datalogger buffer - Leer de la memoria + Leer de la memoria - NaviGPS GT-31/BGT-31 datalogger (.sbp) - Memoria del NaviGPS GT-31/BGT-31 + Memoria del NaviGPS GT-31/BGT-31 - NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) - Fichero de almacenamiento binario del NaviGPS GT-31/BGT-31 SiRF + Fichero de almacenamiento binario del NaviGPS GT-31/BGT-31 SiRF Naviguide binary route file (.twl) @@ -1550,14 +1278,12 @@ 'n' - Conserva el nombre del punto de interÊs existente, 'y' - cambia el nombre de los puntos de interÊs - Navitel binary track (.bin) - Trazado binario Navitel (.bin) + Trazado binario Navitel (.bin) - Navitrak DNA marker format - Fomato del marcador Navitrak DNA + Fomato del marcador Navitrak DNA NetStumbler Summary File (text) @@ -1585,117 +1311,125 @@ El nombre corto es la MAC address - NIMA/GNIS Geographic Names File - Fichero de topÃŗnimos NIMA/GNIS + Fichero de topÃŗnimos NIMA/GNIS - + NMEA 0183 sentences Frases NMEA 018 - + Max length of waypoint name to write Longitud mÃĄxima del nombre del punto de interÊs - + + Image Offset Time (+HH:MM or -HH:MM) + + + + + Google Takeout Location History + + + + Read/write GPRMC sentences Leer/escribir GPRMC frases - + Read/write GPGGA sentences Leer/escribir GPGGA frases - + Read/write GPVTG sentences Leer/escribir GPVTG frases - + Read/write GPGSA sentences Leer/escribir GPGSA frases - + Decimal seconds to pause between groups of strings Demora en dÊcimas de segundo entre textos - + Append realtime positioning data to the output file instead of truncating AÃąadrir el la hora del poscionamiento al fichero de salida en lugar de truncarla - + Speed in bits per second of serial port (baud=4800) Velocidad en bits por segunod del puerto serie (4800 baudios) - + Write tracks for Gisteq Phototracker Escribir trazados para el Gisteq Phototracker - Nokia Landmark Exchange - Nokia Landmark Exchange + Nokia Landmark Exchange - + OpenStreetMap data files Ficheros de datos de OpenStreetMap (gratuitos) - + Write additional way tag key/value pairs Escribir pares adiciones de clave/valor para la etiqueta de sentido - + Write additional node tag key/value pairs Escribir pares adiciones de clave/valor para la etiqueta de nodo - + Use this value as custom created_by value Usar este valor como valor personalizado - + OziExplorer OziExplorer - + Write all tracks into one file Escribir todos los trazados a un fichero Ãēnico - + Waypoint foreground color Color del primer plano del punto de interÊs - + Waypoint background color Color del fondo del punto de interÊs - + Proximity distance Distancia de proximidad - + Unit used in altitude values Unidades usadas en los valores de altitud - + Unit used in proximity values Unidades usadas en los valores de proximidad @@ -1744,24 +1478,20 @@ Quovadis - Raymarine Waypoint File (.rwf) - Fichero de puntos de interÊs Raymarine (.rwf) + Fichero de puntos de interÊs Raymarine (.rwf) - Default location - LocalizaciÃŗn por defecto + LocalizaciÃŗn por defecto - Ricoh GPS Log File - Fichero de memoria de Ricoh GPS + Fichero de memoria de Ricoh GPS - See You flight analysis data - Revisar los datos del anÃĄlisis de tu vuelo + Revisar los datos del anÃĄlisis de tu vuelo Skymap / KMD150 ascii files @@ -1776,8 +1506,8 @@ Baudios usados para inicializar el dispositivo, autodetectar=0 - - + + Baud rate used for download Baudios usados para la descarga @@ -1802,57 +1532,51 @@ Ficheros Suunto Trek Manager (STM) WaypointPlus - Swiss Map 25/50/100 (.xol) - Swiss Map 25/50/100 (.xol) + Swiss Map 25/50/100 (.xol) Tab delimited fields useful for OpenOffice, Ploticus etc. Campos delimitados por tabuladores, Ãētila para OpenOffice, Ploticus etc. - + Textual Output Salida literal - + Suppress separator lines between waypoints Suprimir saltos de línea entre los puntos de interÊs - + Write each waypoint in a separate file escribir cada punto de interÊs en un fichero separado - TomTom Itineraries (.itn) - TomTom Itineraries (.itn) + TomTom Itineraries (.itn) - TomTom POI file (.asc) - TomTom POI file (.asc) + TomTom POI file (.asc) - TomTom POI file (.ov2) - TomTom POI file (.ov2) + TomTom POI file (.ov2) TopoMapPro Places File Fichero de TopoMapPro Places - TrackLogs digital mapping (.trl) - Mapa digital TrackLogs (.trl) + Mapa digital TrackLogs (.trl) - Index of track (if more than one in source) - Indice del trazado (si la fuente tiene mÃĄs de uno) + Indice del trazado (si la fuente tiene mÃĄs de uno) U.S. Census Bureau Tiger Mapping Service @@ -1863,359 +1587,283 @@ Suprimir etiquetas en los puntos creados - - + Time zone ID - + Attempt to recovery data from corrupt file - + Don't create waypoints for non-user points - + Garmin Training Center (.tcx/.crs/.hst/.xml) - - Geogrid-Viewer binary overlay file (.ovl) - - - - + Compact Output. Default is off. - + GeoJson - + GlobalSat DG-200 Download - + list tracks - + get track - - - - + + + + Dump raw data to this file - + GlobalSat GH625XT GPS training watch - - Google Directions XML - - - - + Write KML track (default = 0) - + Units used when writing comments ('s'tatute, 'm'etric,' 'n'autical, 'a'viation) - + Rotate colors for tracks and routes (default automatic) - + Precision of coordinates, number of decimals - + GPS Tracking Key Pro text - + Precision of elevations, number of decimals - - + + Size of blocks in KB to request from device - - iGo Primo points of interest (.upoi) - - - - + (USR input) Ignore event marker icons on read - + (USR output) Treat waypoints as icons on write - + (USR output) Merge into one segmented trail - + (USR input) Break segments into separate trails - + (USR output) Output file title string - + (USR output) Device serial number - + (USR output) Output file content description - - Mainnav - - - - - Mapbar (China) navigation track for Sonim Xp3300 - - - - - Mapfactor Navigator - - - - - Speed in bits per second of serial port (autodetect=0) - - - - - Download logged fixes - - - - - Show device status - - - - - MediaTek Locus - - - - - + + First sector to be read from the device - - + + Baud rate used to init device (0=autodetect) - - + + Last sector to be read from the device (-1: smart read everything) - - + + Disable output (useful with erase) - - + + Number of sectors to read at once (0=use single sector mode) - + POI for Home Symbol as lat:lng[:alt] - + POI for Car Symbol as lat:lng[:alt] - + POI for Boat Symbol as lat:lng[:alt] - + POI for Heart Symbol as lat:lng[:alt] - + POI for Bar Symbol as lat:lng[:alt] - + MiniHomer, a skyTraq Venus 6 based logger (download tracks, waypoints and get/set POI) - + Garmin Mobile XT ([ATRK]/STRK) - + Track name processing option ([0]-nrm/1-ign) - + Mobile Garmin XT Track files - - Motoactiv CSV - - - - - MyNav TRC format - - - - + Accept position fixes in gpgga marked invalid - - Compact binary representation - - - - + codec to use for reading and writing strings (default windows-1252) - + Qstarz BL-1000 - + Set location finder target location as lat,lng - + Configure logging parameter as tmin:tmax:dmin:dmax - - - + + + Seconds that GPS time tracks UTC (0: best guess) - - - + + + GPS week rollover period we're in (-1: best guess) - + SkyTraq Venus based loggers (download) - + First sector to be read from the file - + Last sector to be read from the file (-1: read till empty sector) - + SkyTraq Venus based loggers Binary File Format - + Format for subtitles - + SubRip subtitles for video mapping (.srt) - + Tab delimited fields useful for OpenOffice - - - Teletype [ Get Jonathon Johnson to describe - - - - - TomTom Places Itineraries (.itn) - - Generate file with lat/lon for centering map Crear fichero con lat/lon para centrar el mapa @@ -2261,22 +1909,22 @@ La descripciÃŗn ya es la marca - + Universal csv with field structure in first line Formato csv universal con la estructura de campos en la primera línea - + Write name(s) of format(s) from input session(s) Escribir los de los formatos de entrada en cada sesiÃŗn - + Write filename(s) from input session(s) Escribir el nombre de los ficheros de entrada en cada sesiÃŗn - + Vcard Output (for iPod) Salida Vcard (para iPod) @@ -2305,17 +1953,17 @@ Nombre del icono de infraestructura cerrada - + Video position for which exact GPS time is known (hhmmss[.sss], default is 00:00:00,000) - + GPS time at position video_time (hhmmss[.sss], default is first timestamp of track) - + GPS date at position video_time (yyyymmdd, default is first timestamp of track) @@ -2332,46 +1980,32 @@ Nombre del icono abierto ad-hoc - - Wintec TES file - - - - Wintec WBT-100/200 Binary File Format - Formato de fichero binario Wintec WBT-100/200 + Formato de fichero binario Wintec WBT-100/200 - Wintec WBT-100/200 GPS Download - Descarga de Wintec WBT-100/200 GPS + Descarga de Wintec WBT-100/200 GPS - Wintec WBT-201/G-Rays 2 Binary File Format - Formato de fichero binario Wintec WBT-201/G-Rays 2 + Formato de fichero binario Wintec WBT-201/G-Rays 2 - XAiOX iTrackU Logger - Registors del XAiOX iTrackU + Registors del XAiOX iTrackU - - Appends the input to a backup file - AÃąadir la entrada a una copia de seguridad + AÃąadir la entrada a una copia de seguridad - - Only waypoints that are not the backup file - SÃŗlo los puntos que no estÃĄn en la copia de seguridad + SÃŗlo los puntos que no estÃĄn en la copia de seguridad - XAiOX iTrackU Logger Binary File Format - Formato de fichero binario XAiOX iTrackU Logger + Formato de fichero binario XAiOX iTrackU Logger Yahoo Geocode API data diff --git a/gui/coretool/gpsbabel_fr.qm b/gui/coretool/gpsbabel_fr.qm index b75fdd622..7f9d4c4ef 100644 Binary files a/gui/coretool/gpsbabel_fr.qm and b/gui/coretool/gpsbabel_fr.qm differ diff --git a/gui/coretool/gpsbabel_fr.ts b/gui/coretool/gpsbabel_fr.ts index c9d9b7aa6..4eda6723a 100644 --- a/gui/coretool/gpsbabel_fr.ts +++ b/gui/coretool/gpsbabel_fr.ts @@ -4,7 +4,7 @@ core - + (integer sec or 'auto') Barograph to GPS time diff (entier sec ou 'auto') Barograph de diffÊrence temporelle GPS @@ -25,51 +25,29 @@ Nom de l'icône pour Ad-hoc ouvert - + After output job done sleep n second(s) Faire une pause de n secondes lorsque l'ÊxÊcution est terminÊe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + Allow whitespace synth. shortnames Autoriser les espaces dans les noms courts - + Altitudes are absolute and not clamped to ground Les altitudes sont absolue et idÊpendantes du sol @@ -78,18 +56,18 @@ Ajouter icon_descr à la description - + Append realtime positioning data to the output file instead of truncating Ajoute les donnÊes de position en temps rÊel au fichier de sortie plutôt que de le tronquer - + Base URL for link tag in output URL de base pour l'Êtiquette de lien en sortie - - + + Bitmap of categories Cartographie des catÊgories @@ -98,7 +76,7 @@ Nom de la catÊgorie - + Category number to use for written waypoints NumÊro de catÊgorie pour les balises Êcrites @@ -107,23 +85,22 @@ Couleur des lignes ou des notes - - + Command unit to power itself down Ordonner au GPS de s'Êteindre - + Complete date-free tracks with given date (YYYYMMDD). Ajouter une date donnÊe (AAAAMMJJ) à une trace sans horodatage - + Create unique waypoint names (default = yes) CrÊer des noms de balises uniques (oui par dÊfaut) - + Create waypoints from geocache log entries CrÊer des balises à partir des entrÊs de log gÊocache @@ -136,7 +113,7 @@ Nom de la base de donnÊes (nom de fichier) - + Datum (default=NAD27) Datum (dÊfaut=NAD27) @@ -145,79 +122,70 @@ Nombre de jours après lesquels les points sont considÊrÊs comme anciens - + Decimal seconds to pause between groups of strings Dixième de seconde de pause entre les groups de chaines - + Default category on output CatÊgorie par dÊfaut en sortie - + Default category on output (1..16) CatÊgorie par dÊfaut en sortie (1..16) - - - - - - + + + Default icon name Nom d'icone par dÊfaut - Default location - Endroit par dÊfaut + Endroit par dÊfaut - + Default proximity ProximitÊ par dÊfaut - + Default speed Vitesse par dÊfaut - Default speed for waypoints (knots/hr) - Vitesse par dÊfaut pour les balises (noeuds par heures) + Vitesse par dÊfaut pour les balises (noeuds par heures) - - + + Degrees output as 'ddd', 'dmm'(default) or 'dms' Ecrire les dÊgrÊs en 'd°d°d°', 'd°m'm''(dÊfaut) ou 'd°m's''' - Delete all routes - Supprimer toutes les routes + Supprimer toutes les routes - Delete all track points - Supprimer tous les points de traces + Supprimer tous les points de traces - - Delete all waypoints - Supprimer toutes les balises + Supprimer toutes les balises - + Display labels on track and routepoints (default = 1) Afficher les labels sur les traces et les points de routes (dÊfaut = 1) - + Distance unit [m=metric, s=statute] UnitÊ de distance [m = mÊtrique, s=stature] @@ -230,29 +198,29 @@ Ne pas ajouter les URLs aux descriptions - + Don't show gpi bitmap on device Ne pas afficher les images gpi sur le pÊriphÊrique - + Draw extrusion line from trackpoint to ground GÊnÊrer une ligne d'extrusion entre le sol et le point de trace - + Drop route points that do not have an equivalent waypoint (hidden points) Eliminer les points de route qui n'ont pas de balises Êquivallentes (points cachÊs) - + Enable alerts on speed or proximity distance Activer les alertes de vitesse ou de proximitÊ - - - + + + Encrypt hints using ROT13 Encrypter les signes en ROT13 @@ -261,24 +229,22 @@ Encrypter les signes avec ROT13 - - - - - - - - + + + + + + Erase device data after download Effacer les donnÊes du pÊriphÊrique après tÊlÊchargement - + Export linestrings for tracks and routes Exporter les chaÃŽnes de caractères pour les traces et les routes - + Export placemarks for tracks and routes Exporter les marqueurs pour les traces et les routes @@ -301,39 +267,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + GPS datum (def. WGS 84) @@ -346,25 +290,24 @@ Ignorer les marqueurs d'ÊvÊnements lors de la lecture - + Include extended data for trackpoints (default = 1) Inclure les donnÊes Êtendues pour les points de trace (dÊfaut = 1) - - + + Include groundspeak logs if present Inclure les logs groundspeak si disponible - + Include major turn points (with description) from calculated route Inclure les points de virage (avec description) de la route calculÊe - Include only via stations in route - Inclure seulement les Êtapes dans la route + Inclure seulement les Êtapes dans la route Include short name in bookmarks @@ -379,7 +322,7 @@ Index du champ URL dans le .dbf - + Indicate direction of travel in track icons (default = 0) Indiquer la direction de dÊplacement dans les icones de la trace (dÊfaut = 0) @@ -392,95 +335,50 @@ Nom de l'icône pour l'Infrastructure ouverte - Keep turns if simplify filter is used - Garder les virages si le filtre simplifiÊ est utilisÊ + Garder les virages si le filtre simplifiÊ est utilisÊ - - + + Length of generated shortnames Longueur des nom courts gÊnÊrÊs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Max synthesized shortname length Length of generated shortnames (default 16) Longueur des nom courts gÊnÊrÊs (dÊfaut : 16) - + Line color, specified in hex AABBGGRR Couleur de la ligne, spÊcifiÊ en hexadÊcimal AABBGGRR - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Make synth. shortnames unique Les noms courts sont tous diffÊrents @@ -505,68 +403,27 @@ Type de marqueur pour les points non trouvÊs - + Max length of waypoint name to write Longueur maximum du nom de la balise - - - Max number of comments to write (maxcmts=200) - Nombre maximum de commentaires à Êcrire (maxcmts=200) + Nombre maximum de commentaires à Êcrire (maxcmts=200) Max shortname length when used with -s Longueur maximum du nom court lorsque utilisÊ avec l'option -s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Max synthesized shortname length - Longueur max. de noms courts gÊnÊrÊs - Merge output with existing file Fusionner la sortie avec un fichier existant - - - - + + + + MTK compatible CSV output file Fichier de sortie CSV compatible MTK @@ -575,16 +432,15 @@ Nom de la catÊgorie 'non assignÊe' - New name for the route - Nouveau nom pour la route + Nouveau nom pour la route No separator lines between waypoints Supprimer les lignes de sÊparation entre les balises - + No whitespace in generated shortnames Supprimer les espaces dans les noms courts gÊnÊrÊs @@ -597,32 +453,30 @@ Ne pas rÊcupÊrer les noms d'icones non encryptÊs - Numeric value of bitrate (baud=4800) - Valeur numÊrique de la vitesse de transfert (4800 bauds) + Valeur numÊrique de la vitesse de transfert (4800 bauds) - + Omit Placer name Omettre le nom du Placer - Only read turns; skip all other points - Lire seulement les virages; ne pas tenire compte des autres points + Lire seulement les virages; ne pas tenire compte des autres points - + Path to HTML style sheet Chemin vers une feuille de style HTML - + Precision of coordinates PrÊcision des coordonnÊes - + Proximity distance Distance de proximitÊ @@ -631,57 +485,55 @@ Rayon des cercles - Radius of our big earth (default 6371000 meters) - Rayon de la terre (dÊfaut : 6371000 mètres) + Rayon de la terre (dÊfaut : 6371000 mètres) - Read control points as waypoint/route/none - Lire les points de contrôle en temps à la balise/route/rien + Lire les points de contrôle en temps à la balise/route/rien Read/Write date format (i.e. DDMMYYYY) Lire/Ecrire le format date (i.e. JJMMYYYY) - + Read/Write date format (i.e. yyyy/mm/dd) Lire/Ecrire le format de date (i.e. YYYY/MM/DD) - + Read/write GPGGA sentences Lire/Ecrire des sÊquences GPGGA - + Read/write GPGSA sentences Lire/Ecrire des sÊquences GPGSA - + Read/write GPRMC sentences Lire/Ecrire des sÊquences GPRMC - + Read/write GPVTG sentences Lire/ECrire des sÊquences GPVTG - + Read/Write time format (i.e. HH:mm:ss xx) Lire/Ecrire le format horaire (i.e. HH:mm:ss xx) - + Retain at most this number of position points (0 = unlimited) Retenir au maximum ce nombre de points de positions (0 = illimitÊ) - - + + Return current position as a waypoint Renvoyer la position courante en tant que balise @@ -692,37 +544,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Basename prepended to URL on output Set waypoint name to source filename. Faire correspondre les nom de la balise au nom du fichier source. @@ -732,79 +562,32 @@ Le nom court est l'adresse MAC - + Speed in bits per second of serial port (baud=4800) Vitesse du port sÊrie en bits par seconde (baud=4800) - Split input into separate files - DÊcouper l'entrÊe en fichiers sÊparÊs + DÊcouper l'entrÊe en fichiers sÊparÊs - Split into multiple routes at turns - SÊparer en plusieurs routes à chaque virage + SÊparer en plusieurs routes à chaque virage - + Write course rather than history, default yes - + Sport: Biking (deflt), Running, MultiSport, Other - - - Geogrid-Viewer ascii overlay file (.ovl) - - - - - Geogrid-Viewer tracklogs (.log) - - - - - Index of track to write (if more than one in source) - - - - - iGO2008 points of interest (.upoi) - - - - - IGO8 .trk - - - - - Track identification number - - - - - Track title - - - - - Track description - - Starting seed of the internal number generator Racine du gÊnÊrateur de nombres internes - - - Index of route to write (if more than one in source) - - Stealth encrypted icon name RÊcupÊrer les noms d'icones encryptÊs @@ -814,104 +597,89 @@ RÊcupÊrer les noms d'icones non encryptÊs - + Set location finder target location as lat,lng - + Configure logging parameter as tmin:tmax:dmin:dmax - - - + + + Seconds that GPS time tracks UTC (0: best guess) - - - + + Image Offset Time (+HH:MM or -HH:MM) + + + + + Google Takeout Location History + + + + + + GPS week rollover period we're in (-1: best guess) - + codec to use for reading and writing strings (default windows-1252) - + SkyTraq Venus based loggers (download) - + First sector to be read from the file - + Last sector to be read from the file (-1: read till empty sector) - + SkyTraq Venus based loggers Binary File Format - + Format for subtitles - + SubRip subtitles for video mapping (.srt) - - Swiss Map 25/50/100 (.xol) - - - - + Tab delimited fields useful for OpenOffice - - Teletype [ Get Jonathon Johnson to describe - - - - - TomTom Places Itineraries (.itn) - - - - - Index of track (if more than one in source) - - - - + Write name(s) of format(s) from input session(s) - + Write filename(s) from input session(s) - - - Wintec TES file - - String to separate concatenated address fields (default=", ") Chaine de caractère pour sÊparer les champs d'adresse (", " par dÊfaut) @@ -925,14 +693,13 @@ Suypprimer les gÊocaches dÊsactivÊes - + Suppress separator lines between waypoints Supprimer les lignes sÊparatrices entre les balises - Suppress use of handshaking in name of speed - Supprimer les controles pour amÊliorer les performances + Supprimer les controles pour amÊliorer les performances Suppress whitespace in generated shortnames @@ -943,22 +710,21 @@ Symbole à utiliser pour les donnÊes de type point - + Sync GPS time to computer time Synchroniser l'heure du GPS avec l'heure du PC - Synthesize track times - Simplifier l'horodatage des traces + Simplifier l'horodatage des traces - + Target GPX version for output Version du fichier GPX pour la sortie - + Temperature unit [c=Celsius, f=Fahrenheit] UnitÊ de tempÊrature (c=Celsius, f=Farenheit) @@ -975,13 +741,13 @@ Type de fichier .an1 - - + + Units for altitude (f)eet or (m)etres UnitÊs d'altitude (p)ieds ou (m)ètres - + Units used for names with @speed ('s'tatute or 'm'etric) UnitÊs utilisÊes avec @vitess ('s'tatute ou 'm'Êtrique) @@ -992,38 +758,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + UPPERCASE synth. shortnames Noms courts en MAJUSCULE @@ -1038,48 +782,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Use shortname instead of description Utiliser le nom court au lieu de la description - + Use specified bitmap on output Utiliser l'images spÊcifiÊe en sortie - + Version of gdb file to generate (1..3) Version du fichier gbd à gÊnÊrer (1..3) @@ -1088,12 +809,12 @@ Version du fichier mapsource à crÊer (3,4,5) - + Waypoint background color Couleur de fond de la balise - + Waypoint foreground color Couleur de la balise @@ -1106,54 +827,65 @@ Largeur de la carte en pixels - + Width of lines, in pixels Largeur des lignes en pixels - + Write additional node tag key/value pairs Ecrire des Êtiquettes de noeuds additionnelles clÊ/valeurs - + Write additional way tag key/value pairs Ecrire des Êtiquettes de chemins additionnelles clÊ/valeurs - + Write all tracks into one file Ecrire toutes les traces dans un fichier - + Write description to address field Ecrire la description dans le champ d'adresse - + Write each waypoint in a separate file Ecrire chaque balise dans un fichier sÊparÊ - + Write notes to address field Ecrire les notes dans le champ d'adresse - + Write position to address field Ecrire la position dans le champ d'adresse - - + + Write position using this grid. Ecrire la position en utilisant cette grille. - - + + + + + + + + + + + + + Write timestamps with offset x to UTC time Ecrire l'horodatage avec un dÊcalage de x par rapport à l'heure UTC @@ -1162,7 +894,7 @@ Ecrire des traces compatibles avec CartoExploreur - + Write tracks for Gisteq Phototracker Ecrire les traces pour Gisteq Phototracker @@ -1172,911 +904,542 @@ - Brauniger IQ Series Barograph Download - - - - - Cambridge/Winpilot glider software + Columbus/Visiontac V900 files (.csv) - Columbus/Visiontac V900 files (.csv) + Comma separated values - - Comma separated values + + Data Logger iBlue747 csv - - Data Logger iBlue747 csv + + Embedded Exif-GPS data (.jpg) - - DeLorme GPL + + Set waypoint name to source filename - - DeLorme Street Atlas Plus + + Data Logger iBlue757 csv - - DeLorme Street Atlas Route + + Time-frame (in seconds) - - Destinator Itineraries (.dat) + + Locate waypoint for tagging by this name - - Destinator Points of Interest (.dat) + + !OVERWRITE! the original file. Default=N - - Destinator TrackLogs (.dat) + + Source for name field in .dbf - - EasyGPS binary format + + Source for URL field in .dbf - - Embedded Exif-GPS data (.jpg) - - - - - Set waypoint name to source filename - - - - - Data Logger iBlue757 csv - - - - - Time-frame (in seconds) - - - - - Locate waypoint for tagging by this name - - - - - !OVERWRITE! the original file. Default=N - - - - - Energympro GPS training watch - - - - - Enigma binary waypoint file (.ert) - - - - - Source for name field in .dbf - - - - - Source for URL field in .dbf - - - - + ESRI shapefile - - F90G Automobile DVR GPS log file - - - - + FAI/IGC Flight Recorder Data Format - + Read all points even if latitude or longitude is missing - + Flexible and Interoperable Data Transfer (FIT) Activity file - - FlySight GPS File - - - - - Franson GPSGate Simulation - - - - - Fugawi - - - - + Garmin 301 Custom position and heartrate - + Garmin G1000 datalog input filter file - - Garmin Logbook XML - - - - + Garmin MapSource - gdb - + Garmin MapSource - txt (tab delimited) - + Garmin POI database - + codec to use for writing strings - + language code to use for reading dual language files - + Garmin Points of Interest (.gpi) - + Erase existing courses when writing new ones - + Speed in bits per second of serial port (baud=9600) Vitesse du port sÊrie en bits par seconde (baud=4800) {9600)?} - - Garmin serial/USB protocol + + override codec to use for device - - Garmin Training Center (.tcx/.crs/.hst/.xml) + + Garmin serial/USB protocol - - Geocaching.com .loc + + Garmin Training Center (.tcx/.crs/.hst/.xml) - - GEOnet Names Server (GNS) + + Geocaching.com .loc - + GlobalSat DG-100/BT-335 Download - - - - + + + + Only erase device data, do not download anything - + Google Earth (Keyhole) Markup Language - - Google Navigator Tracklines (.trl) - - - - + GPS TrackMaker - + GPSBabel arc filter file - + GpsDrive Format - + GpsDrive Format for Tracks - + GPX XML - + Add info (depth) as Humminbird extension - + Add info (depth) as Garmin extension - - HikeTech - - - - - Holux (gm-100) .wpo Format - - - - + Holux M-241 (MTK based) Binary File Format - + Holux M-241 (MTK based) download - - - + + Enable logging after download - + HTML Output - + Humminbird tracks (.ht) - + Humminbird waypoints and routes (.hwr) - - IGN Rando track files - - - - - Kompass (DAV) Track (.tk) - - - - - Kompass (DAV) Waypoints (.wp) - - - - + Lowrance USR - + (USR output) Write version - - Magellan SD files (as for eXplorist) - - - - - Magellan SD files (as for Meridian) - - - - - Magellan serial protocol - - - - - MagicMaps IK3D project file (.ikt) - - - - - Map&Guide 'TourExchangeFormat' XML - - - - - MapAsia track file (.tr7) - - - - - Mapopolis.com Mapconverter CSV - - - - - MapTech Exchange Format - - - - - Memory-Map Navigator overlay files (.mmo) - - - - - Write items 'locked' [default no] - - - - - Write items 'visible' [default yes] - - - - - Write files with internal version [n] - - - - - Microsoft Streets and Trips 2002-2007 - - - - - Motorrad Routenplaner (Map&Guide) .bcr files - - - - + MTK Logger (iBlue 747,...) Binary File Format - + MTK Logger (iBlue 747,Qstarz BT-1000,...) download - + National Geographic Topo .tpg (waypoints) - + National Geographic Topo 2.x .tpo - + National Geographic Topo 3.x/4.x .tpo - - Navigon Waypoints - - - - - NaviGPS GT-11/BGT-11 Download - - - - - Clear the datalog - - - - - Read from datalogger buffer - - - - - NaviGPS GT-31/BGT-31 datalogger (.sbp) - - - - - NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) - - - - - + Time zone ID - + Attempt to recovery data from corrupt file - + Don't create waypoints for non-user points - - Geogrid-Viewer binary overlay file (.ovl) - - - - + Compact Output. Default is off. - + GeoJson - + GlobalSat DG-200 Download - + list tracks - + get track - - - - + + + + Dump raw data to this file - + GlobalSat GH625XT GPS training watch - - Google Directions XML - - - - + Write KML track (default = 0) - + Units used when writing comments ('s'tatute, 'm'etric,' 'n'autical, 'a'viation) - + Rotate colors for tracks and routes (default automatic) - + Precision of coordinates, number of decimals - + GPS Tracking Key Pro text - + Precision of elevations, number of decimals - - + + Size of blocks in KB to request from device - - iGo Primo points of interest (.upoi) - - - - + (USR input) Ignore event marker icons on read - + (USR output) Treat waypoints as icons on write - + (USR output) Merge into one segmented trail - + (USR input) Break segments into separate trails - + (USR output) Output file title string - + (USR output) Device serial number - + (USR output) Output file content description - - Mainnav - - - - - Mapbar (China) navigation track for Sonim Xp3300 - - - - - Mapfactor Navigator - - - - - Speed in bits per second of serial port (autodetect=0) - - - - - Download logged fixes - - - - - Show device status - - - - - MediaTek Locus - - - - - + + First sector to be read from the device - - + + Baud rate used to init device (0=autodetect) - - + + Last sector to be read from the device (-1: smart read everything) - - + + Disable output (useful with erase) - - + + Number of sectors to read at once (0=use single sector mode) - + POI for Home Symbol as lat:lng[:alt] - + POI for Car Symbol as lat:lng[:alt] - + POI for Boat Symbol as lat:lng[:alt] - + POI for Heart Symbol as lat:lng[:alt] - + POI for Bar Symbol as lat:lng[:alt] - + MiniHomer, a skyTraq Venus 6 based logger (download tracks, waypoints and get/set POI) - + Garmin Mobile XT ([ATRK]/STRK) - + Track name processing option ([0]-nrm/1-ign) - + Mobile Garmin XT Track files - - Motoactiv CSV - - - - - MyNav TRC format - - - - - Navitel binary track (.bin) - - - - - Navitrak DNA marker format - - - - - NIMA/GNIS Geographic Names File - - - - + Accept position fixes in gpgga marked invalid - + NMEA 0183 sentences - - Compact binary representation - - - - - Nokia Landmark Exchange - - - - + OpenStreetMap data files - + Use this value as custom created_by value - + OziExplorer - + Unit used in altitude values - + Unit used in proximity values - - Raymarine Waypoint File (.rwf) - - - - - Ricoh GPS Log File - - - - - See You flight analysis data - - - - - + + Baud rate used for download - + Qstarz BL-1000 - + Video position for which exact GPS time is known (hhmmss[.sss], default is 00:00:00,000) - + GPS time at position video_time (hhmmss[.sss], default is first timestamp of track) - + GPS date at position video_time (yyyymmdd, default is first timestamp of track) - + Textual Output - - TomTom Itineraries (.itn) - - - - - TomTom POI file (.asc) - - - - - TomTom POI file (.ov2) - - - - - TrackLogs digital mapping (.trl) - - - - + Universal csv with field structure in first line - + Vcard Output (for iPod) - - - Wintec WBT-100/200 Binary File Format - - - - - Wintec WBT-100/200 GPS Download - - - - - Wintec WBT-201/G-Rays 2 Binary File Format - - - - - XAiOX iTrackU Logger - - - - - - Appends the input to a backup file - - - - - - Only waypoints that are not the backup file - - - - - XAiOX iTrackU Logger Binary File Format - - diff --git a/gui/coretool/gpsbabel_hu.qm b/gui/coretool/gpsbabel_hu.qm index 57bcfd6f0..71496ce1d 100644 Binary files a/gui/coretool/gpsbabel_hu.qm and b/gui/coretool/gpsbabel_hu.qm differ diff --git a/gui/coretool/gpsbabel_hu.ts b/gui/coretool/gpsbabel_hu.ts index 997d3e199..d67827e99 100644 --- a/gui/coretool/gpsbabel_hu.ts +++ b/gui/coretool/gpsbabel_hu.ts @@ -4,7 +4,7 @@ core - + (integer sec or 'auto') Barograph to GPS time diff BaromÊter adatok GPS pozíciÃŗba (mÃĄsodperc vagy 'auto') @@ -25,51 +25,29 @@ Ad-hoc nyílt hÃĄlÃŗzat ikonnÊv - + After output job done sleep n second(s) FeltÃļltÊs utÃĄn x mÃĄsodperccel kikapcsolÃĄs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + Allow whitespace synth. shortnames SzÃŗkÃļzÃļk engedÊlyezÊse rÃļvidnevek kÊszítÊsekor - + Altitudes are absolute and not clamped to ground A magassÃĄg abszolÃēt, nincs a felszínhez kÃļtve @@ -78,18 +56,18 @@ icon_descr hozzÃĄføzÊse a megjegyzÊshez - + Append realtime positioning data to the output file instead of truncating A kimeneti fÃĄjl csonkítÃĄsa helyett valÃŗsidÃĩ hozzÃĄføzÊse a pozíciÃŗhoz - + Base URL for link tag in output AlapÊrt. URL a hivatkozÃĄsokban - - + + Bitmap of categories Raszter kategÃŗria @@ -98,7 +76,7 @@ KategÃŗria nÊv (Cache) - + Category number to use for written waypoints A kÊszÃŧlÃĩ Ãētpontok kategÃŗria-szÃĄma @@ -107,23 +85,22 @@ Vonalak Ês tÊrkÊp-megjegyzÊsek színe - - + Command unit to power itself down ZÃĄrÃĄskÊnt a kÊszÃŧlÊk kikapcsolÃĄsa - + Complete date-free tracks with given date (YYYYMMDD). DÃĄtum nÊlkÃŧli nyomvonalak Ãēj idÃĩpontja (ÉÉÉÉHHNN) - + Create unique waypoint names (default = yes) Egyedi Ãētpont nevek (alapÊrt. = igen) - + Create waypoints from geocache log entries Útpontok kÊszítÊse a geocaching bejegyzÊsekbÃĩl @@ -136,7 +113,7 @@ AdatbÃĄzis nÊv (fÃĄjlnÊv) - + Datum (default=NAD27) TÊrkÊpdÃĄtum (alapÊrt.=NAD27) @@ -145,79 +122,70 @@ Ennyi nap utÃĄn a pontok elÊvÃŧltnek szÃĄmítanak - + Decimal seconds to pause between groups of strings Ennyi mÃĄsodpercnyi szÃŧnet az adatfolyamban - + Default category on output AlapÊrt. kimeneti kategÃŗria - + Default category on output (1..16) AlapÊrtelmezett kimeneti kategÃŗria (1.. 16) - - - - - - + + + Default icon name AlapÊrtelmezett ikonnÊv - Default location - AlapÊrtelmezett pozíciÃŗ + AlapÊrtelmezett pozíciÃŗ - + Default proximity AlapÊrt. tÃĄvolsÃĄg - + Default speed AlapÊrt. sebessÊg - Default speed for waypoints (knots/hr) - AlapÊrtelmezett sebessÊg a pontokhoz (csomÃŗ/Ãŗ) + AlapÊrtelmezett sebessÊg a pontokhoz (csomÃŗ/Ãŗ) - - + + Degrees output as 'ddd', 'dmm'(default) or 'dms' PozíciÃŗ formÃĄtum 'fff', 'fpp'(alapÊrt.) vagy 'fpm' - Delete all routes - Minden Ãētvonal tÃļrlÊse + Minden Ãētvonal tÃļrlÊse - Delete all track points - Minden nyomvonalpont tÃļrlÊse + Minden nyomvonalpont tÃļrlÊse - - Delete all waypoints - Minden Ãētpont tÃļrlÊse + Minden Ãētpont tÃļrlÊse - + Display labels on track and routepoints (default = 1) Címke megjelenítÊse nyomvonalakon Ês Ãētvonalakon (alapÊrt.=1) - + Distance unit [m=metric, s=statute] TÃĄvolsÃĄg mÊrtÊkegysÊge [m=metrikus, s=angolszÃĄsz] @@ -230,29 +198,29 @@ URL mezÃĩ kihagyÃĄsa a megjegyzÊsbÃĩl - + Don't show gpi bitmap on device gpi raszter rejtÊse a kÊszÃŧlÊken - + Draw extrusion line from trackpoint to ground Meghosszabított vonal rajzolÃĄsa ÃētponttÃŗl felszínig - + Drop route points that do not have an equivalent waypoint (hidden points) Útvonalpont elhagyÃĄsa, aminek nincs megegyezÃĩ Ãētpontja (rejtett pontok) - + Enable alerts on speed or proximity distance FigyelmeztetÊs engedÊlyezÊse sebessÊgnÊl vagy kÃļzeledÊskor - - - + + + Encrypt hints using ROT13 MegjegyzÊsek kÃŗdolÃĄsa ROT13 hasznÃĄlatÃĄval @@ -261,24 +229,22 @@ MegyjegyzÊsek kÃŗdolÃĄsa ROT13-al - - - - - - - - + + + + + + Erase device data after download A kÊszÃŧlÊk memÃŗriÃĄjÃĄnak tÃļrlÊse letÃļltÊs utÃĄn - + Export linestrings for tracks and routes Vonal-szÃļveg exportÃĄlÃĄsa nyomvonalakba Ês Ãētvonalakba - + Export placemarks for tracks and routes Hely-jelÃļlÊsek exportÃĄlÃĄsa nyomvonalakba Ês Ãētvonalakba @@ -301,39 +267,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + GPS datum (def. WGS 84) GPS dÃĄtum (alapÊrt. WGS 84) @@ -346,25 +290,24 @@ EsemÊny pontok kihagyÃĄsa - + Include extended data for trackpoints (default = 1) BÃĩvített informÃĄciÃŗk hasznÃĄlata a nyomvonalakban (alapÊrt.=1) - - + + Include groundspeak logs if present Groundspeak bejegyzÊsek hasznÃĄlata (ha van) - + Include major turn points (with description) from calculated route FÃĩ kanyarodÃĄsi pontok hasznÃĄlata a szÃĄmított ÃētvonalbÃŗl (megjegyzÊssel) - Include only via stations in route - Csak az ÃĄllomÃĄsok hasznÃĄlata az Ãētvonalban + Csak az ÃĄllomÃĄsok hasznÃĄlata az Ãētvonalban Include short name in bookmarks @@ -379,7 +322,7 @@ URL mezÃĩ hivatkozÃĄsa a .dbf fÃĄjlban - + Indicate direction of travel in track icons (default = 0) IrÃĄny mutatÃĄsa a nyomvonal ikonjÃĄnÃĄl @@ -392,95 +335,50 @@ Nyitott HotSpot ikonnÊv - Keep turns if simplify filter is used - FordulÃŗpontok megtartÃĄsa egyszerøsítÊs esetÊn is. + FordulÃŗpontok megtartÃĄsa egyszerøsítÊs esetÊn is. - - + + Length of generated shortnames RÃļvidnevek hosszÃēsÃĄga - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Max synthesized shortname length Length of generated shortnames (default 16) RÃļvidnevek hosszÃēsÃĄga (alapÊrt. 16) - + Line color, specified in hex AABBGGRR Vonal színe (hexa ÊrtÊk AABBGGRR) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Make synth. shortnames unique A kÊszÃŧlÃĩ rÃļvidnevek egyediek legyenek @@ -505,68 +403,27 @@ Meg nem talÃĄlt pont jele - + Max length of waypoint name to write Útpont nevÊnek max. hosszÃēsÃĄga - - - Max number of comments to write (maxcmts=200) - MegjegyzÊs max. hossza (maxcmts=200) + MegjegyzÊs max. hossza (maxcmts=200) Max shortname length when used with -s RÃļvidnÊv hosszÃĄnak ÊrtÊke -s hasznÃĄlatÃĄval - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Max synthesized shortname length - ElÃĩÃĄllított rÃļvidnevek max. hosszÃēsÃĄga - Merge output with existing file A jelenleg Ês a kÊsz fÃĄjl ÃļsszeføzÊse - - - - + + + + MTK compatible CSV output file MTK kompatibilis CSV kÊszítÊs @@ -575,16 +432,15 @@ Az 'unassigned' kategÃŗria neve - New name for the route - Az Ãētvonal Ãēj neve + Az Ãētvonal Ãēj neve No separator lines between waypoints Nincs elvÃĄlasztÃŗ karakter az Ãētpontok kÃļzÃļtt - + No whitespace in generated shortnames SzÃŗkÃļzÃļk mellÃĩzÊse a rÃļvidnevekben @@ -597,32 +453,30 @@ Nem elcsent, nem titkosított ikonnÊv - Numeric value of bitrate (baud=4800) - BitrÃĄta ÊrtÊke (baud=4800) + BitrÃĄta ÊrtÊke (baud=4800) - + Omit Placer name ElhelyezÃĩ nevÊnek elhagyÃĄsa - Only read turns; skip all other points - Csak a fordulÃŗpontok hasznÃĄlata (a tÃļbbi pont kihagyÃĄsa) + Csak a fordulÃŗpontok hasznÃĄlata (a tÃļbbi pont kihagyÃĄsa) - + Path to HTML style sheet HivatkozÃĄs HTML style sheet-be - + Precision of coordinates KoordinÃĄtÃĄk pontossÃĄga - + Proximity distance KÃļzelesÊdi riasztÃĄs ÊrtÊke @@ -631,57 +485,55 @@ KÃļr sugara - Radius of our big earth (default 6371000 meters) - A FÃļld sugara (alapÊrt. 6371000 mÊter) + A FÃļld sugara (alapÊrt. 6371000 mÊter) - Read control points as waypoint/route/none - Pontok beolvasÃĄsa, mint Ãētpont/Ãētvonal/nincs + Pontok beolvasÃĄsa, mint Ãētpont/Ãētvonal/nincs Read/Write date format (i.e. DDMMYYYY) DÃĄtum formÃĄtum írÃĄsa/olvasÃĄsa (NN/HH/ÉÉÉÉ) - + Read/Write date format (i.e. yyyy/mm/dd) DÃĄtum formÃĄtum írÃĄsa/olvasÃĄsa (ÊÊÊÊ/hh/nn) - + Read/write GPGGA sentences GPGGA montadok írÃĄsa/olvasÃĄsa - + Read/write GPGSA sentences GPGSA montadok írÃĄsa/olvasÃĄsa - + Read/write GPRMC sentences GPRMC montadok írÃĄsa/olvasÃĄsa - + Read/write GPVTG sentences GPVTG montadok írÃĄsa/olvasÃĄsa - + Read/Write time format (i.e. HH:mm:ss xx) IdÃĩ írÃĄsa/olvasÃĄsa (ÓÓ:pp:mm xx) - + Retain at most this number of position points (0 = unlimited) Max. pontszÃĄm megtartÃĄsa a 'snail tail' elÃĩÃĄllítÃĄsakor (0= vÊgtelen) - - + + Return current position as a waypoint VisszatÊrÊs a jelenlegi pozíciÃŗba, mint Ãētpont @@ -694,79 +546,32 @@ A rÃļvidnÊv, mint MAC cím - + Speed in bits per second of serial port (baud=4800) Soros port sebessÊge (bps; baud=4800) - Split input into separate files - Beviteli adatok darabolÃĄsa kÃŧlÃļn fÃĄjlokba + Beviteli adatok darabolÃĄsa kÃŧlÃļn fÃĄjlokba - Split into multiple routes at turns - Összetett Ãētvonalakba Ês fordulÃŗpontokba darabolÃĄs + Összetett Ãētvonalakba Ês fordulÃŗpontokba darabolÃĄs - + Write course rather than history, default yes - + Sport: Biking (deflt), Running, MultiSport, Other - - - Geogrid-Viewer ascii overlay file (.ovl) - - - - - Geogrid-Viewer tracklogs (.log) - - - - - Index of track to write (if more than one in source) - - - - - iGO2008 points of interest (.upoi) - - - - - IGO8 .trk - - - - - Track identification number - - - - - Track title - - - - - Track description - - Starting seed of the internal number generator KezdÃĩÊrtÊk a belsÃĩ indexhez - - - Index of route to write (if more than one in source) - - Stealth encrypted icon name Titkosan kÃŗdolt ikonnevek @@ -776,104 +581,89 @@ Nem titkosított ikonnevek elcsenÊse - + Set location finder target location as lat,lng - + Configure logging parameter as tmin:tmax:dmin:dmax - - - + + + Seconds that GPS time tracks UTC (0: best guess) - - - + + Image Offset Time (+HH:MM or -HH:MM) + + + + + Google Takeout Location History + + + + + + GPS week rollover period we're in (-1: best guess) - + codec to use for reading and writing strings (default windows-1252) - + SkyTraq Venus based loggers (download) - + First sector to be read from the file - + Last sector to be read from the file (-1: read till empty sector) - + SkyTraq Venus based loggers Binary File Format - + Format for subtitles - + SubRip subtitles for video mapping (.srt) - - Swiss Map 25/50/100 (.xol) - - - - + Tab delimited fields useful for OpenOffice - - Teletype [ Get Jonathon Johnson to describe - - - - - TomTom Places Itineraries (.itn) - - - - - Index of track (if more than one in source) - - - - + Write name(s) of format(s) from input session(s) - + Write filename(s) from input session(s) - - - Wintec TES file - - String to separate concatenated address fields (default=", ") ÖsszeføzÃļtt címnevek elvÃĄlasztÃĄsa (alapÊrt.=", ") @@ -887,14 +677,13 @@ KiÃļregedett geolÃĄdÃĄk elhagyÃĄsa - + Suppress separator lines between waypoints ElvÃĄlasztÃŗ vonalak elhagyÃĄsa Ãētpontok kÃļzÃļtt - Suppress use of handshaking in name of speed - KÊzfogÃĄs elhagyÃĄsa a sebessÊgneveknÊl + KÊzfogÃĄs elhagyÃĄsa a sebessÊgneveknÊl Suppress whitespace in generated shortnames @@ -905,22 +694,21 @@ Útpontok szimbÃŗluma - + Sync GPS time to computer time GPS idÃĩ szinkronizÃĄlÃĄsa a szÃĄmítÃŗgÊppel - Synthesize track times - Nyomvonal idejÊnek elÃĩÃĄllítÃĄsa + Nyomvonal idejÊnek elÃĩÃĄllítÃĄsa - + Target GPX version for output A kimeneti GPX fÃĄjl verziÃŗja - + Temperature unit [c=Celsius, f=Fahrenheit] HÃĩmÊrsÊklet mÊrtÊkegysÊge [c=Celsius, f=Fahrenheit] @@ -937,13 +725,13 @@ A .an1 fÃĄjl típusa - - + + Units for altitude (f)eet or (m)etres MagassÃĄg mÊrtÊkegysÊge (mÊter vagy lÃĄb) - + Units used for names with @speed ('s'tatute or 'm'etric) SebessÊg mÊrtÊkegysÊge a neveknÊl ('s' angolszÃĄsz vagy 'm' metrikus) @@ -954,38 +742,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + UPPERCASE synth. shortnames NAGYBETØS rÃļvidnevek elÃĩÃĄllítÃĄsa @@ -1000,48 +766,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Use shortname instead of description RÃļvid nÊv hasznÃĄlata a megyjegyzÊs helyett - + Use specified bitmap on output MeghatÃĄrozott raszter hasznÃĄlata a kimenetben - + Version of gdb file to generate (1..3) A kÊszÃŧlÃĩ gdb fÃĄjl típusa (1..3) @@ -1050,12 +793,12 @@ A kÊszÃŧlÃĩ MapSource fÃĄjl típusa (3,4,5) - + Waypoint background color Útpont hÃĄttÊrszíne - + Waypoint foreground color Útpont színe @@ -1068,54 +811,65 @@ TÊrkÊpi szÊlessÊg (pixel) - + Width of lines, in pixels VonalvastagsÃĄg (pixel) - + Write additional node tag key/value pairs TovÃĄbbi kulcs/ÊrtÊk címkepÃĄr írÃĄsa (pont) - + Write additional way tag key/value pairs TovÃĄbbi kulcs/ÊrtÊk címkepÃĄr írÃĄsa (Ãēt) - + Write all tracks into one file Az Ãļsszes nyomvonal ÃļsszeføzÊse egy fÃĄjlba - + Write description to address field MegjegyzÊst a cím mezÃĩbe - + Write each waypoint in a separate file Minden Ãētpont kÃŧlÃļn fÃĄjlba - + Write notes to address field MegjegyzÊs írÃĄsa a cím megjegyzÊsbe - + Write position to address field PozíciÃŗ írÃĄsa a cím megjegyzÊsbe - - + + Write position using this grid. PozíciÃŗ kÊszítÊse ezzel a rÃĄccsal - - + + + + + + + + + + + + + Write timestamps with offset x to UTC time IdÃĩÊrtÊkek eltolÃĄsa x ÊrtÊkkel UTC-hez kÊpest @@ -1124,7 +878,7 @@ Carto Exploreur kompatibilis nyomvonal kÊszítÊse - + Write tracks for Gisteq Phototracker Gisteq Phototracker kompatibilis nyomvonal kÊszítÊse @@ -1135,947 +889,556 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Basename prepended to URL on output - Brauniger IQ Series Barograph Download - - - - - Cambridge/Winpilot glider software + Columbus/Visiontac V900 files (.csv) - Columbus/Visiontac V900 files (.csv) + Comma separated values - - Comma separated values + + Data Logger iBlue747 csv - - Data Logger iBlue747 csv + + Embedded Exif-GPS data (.jpg) - - DeLorme GPL + + Set waypoint name to source filename - - DeLorme Street Atlas Plus + + Data Logger iBlue757 csv - - DeLorme Street Atlas Route + + Time-frame (in seconds) - - Destinator Itineraries (.dat) + + Locate waypoint for tagging by this name - - Destinator Points of Interest (.dat) + + !OVERWRITE! the original file. Default=N - - Destinator TrackLogs (.dat) + + Source for name field in .dbf - - EasyGPS binary format + + Source for URL field in .dbf - - Embedded Exif-GPS data (.jpg) - - - - - Set waypoint name to source filename - - - - - Data Logger iBlue757 csv - - - - - Time-frame (in seconds) - - - - - Locate waypoint for tagging by this name - - - - - !OVERWRITE! the original file. Default=N - - - - - Energympro GPS training watch - - - - - Enigma binary waypoint file (.ert) - - - - - Source for name field in .dbf - - - - - Source for URL field in .dbf - - - - + ESRI shapefile - - F90G Automobile DVR GPS log file - - - - + FAI/IGC Flight Recorder Data Format - + Read all points even if latitude or longitude is missing - + Flexible and Interoperable Data Transfer (FIT) Activity file - - FlySight GPS File - - - - - Franson GPSGate Simulation - - - - - Fugawi - - - - + Garmin 301 Custom position and heartrate - + Garmin G1000 datalog input filter file - - Garmin Logbook XML - - - - + Garmin MapSource - gdb - + Garmin MapSource - txt (tab delimited) - + Garmin POI database - + codec to use for writing strings - + language code to use for reading dual language files - + Garmin Points of Interest (.gpi) - + Erase existing courses when writing new ones - + Speed in bits per second of serial port (baud=9600) Soros port sebessÊge (bps; baud=4800) {9600)?} - - Garmin serial/USB protocol + + override codec to use for device - - Garmin Training Center (.tcx/.crs/.hst/.xml) + + Garmin serial/USB protocol - - Geocaching.com .loc + + Garmin Training Center (.tcx/.crs/.hst/.xml) - - GEOnet Names Server (GNS) + + Geocaching.com .loc - + GlobalSat DG-100/BT-335 Download - - - - + + + + Only erase device data, do not download anything - + Google Earth (Keyhole) Markup Language - - Google Navigator Tracklines (.trl) - - - - + GPS TrackMaker - + GPSBabel arc filter file - + GpsDrive Format - + GpsDrive Format for Tracks - + GPX XML - + Add info (depth) as Humminbird extension - + Add info (depth) as Garmin extension - - HikeTech - - - - - Holux (gm-100) .wpo Format - - - - + Holux M-241 (MTK based) Binary File Format - + Holux M-241 (MTK based) download - - - + + Enable logging after download - + HTML Output - + Humminbird tracks (.ht) - + Humminbird waypoints and routes (.hwr) - - IGN Rando track files - - - - - Kompass (DAV) Track (.tk) - - - - - Kompass (DAV) Waypoints (.wp) - - - - + Lowrance USR - + (USR output) Write version - - Magellan SD files (as for eXplorist) - - - - - Magellan SD files (as for Meridian) - - - - - Magellan serial protocol - - - - - MagicMaps IK3D project file (.ikt) - - - - - Map&Guide 'TourExchangeFormat' XML - - - - - MapAsia track file (.tr7) - - - - - Mapopolis.com Mapconverter CSV - - - - - MapTech Exchange Format - - - - - Memory-Map Navigator overlay files (.mmo) - - - - - Write items 'locked' [default no] - - - - - Write items 'visible' [default yes] - - - - - Write files with internal version [n] - - - - - Microsoft Streets and Trips 2002-2007 - - - - - Motorrad Routenplaner (Map&Guide) .bcr files - - - - + MTK Logger (iBlue 747,...) Binary File Format - + MTK Logger (iBlue 747,Qstarz BT-1000,...) download - + National Geographic Topo .tpg (waypoints) - + National Geographic Topo 2.x .tpo - + National Geographic Topo 3.x/4.x .tpo - - Navigon Waypoints - - - - - NaviGPS GT-11/BGT-11 Download - - - - - Clear the datalog - - - - - Read from datalogger buffer - - - - - NaviGPS GT-31/BGT-31 datalogger (.sbp) - - - - - NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) - - - - - + Time zone ID - + Attempt to recovery data from corrupt file - + Don't create waypoints for non-user points - - Geogrid-Viewer binary overlay file (.ovl) - - - - + Compact Output. Default is off. - + GeoJson - + GlobalSat DG-200 Download - + list tracks - + get track - - - - + + + + Dump raw data to this file - + GlobalSat GH625XT GPS training watch - - Google Directions XML - - - - + Write KML track (default = 0) - + Units used when writing comments ('s'tatute, 'm'etric,' 'n'autical, 'a'viation) - + Rotate colors for tracks and routes (default automatic) - + Precision of coordinates, number of decimals - + GPS Tracking Key Pro text - + Precision of elevations, number of decimals - - + + Size of blocks in KB to request from device - - iGo Primo points of interest (.upoi) - - - - + (USR input) Ignore event marker icons on read - + (USR output) Treat waypoints as icons on write - + (USR output) Merge into one segmented trail - + (USR input) Break segments into separate trails - + (USR output) Output file title string - + (USR output) Device serial number - + (USR output) Output file content description - - Mainnav - - - - - Mapbar (China) navigation track for Sonim Xp3300 - - - - - Mapfactor Navigator - - - - - Speed in bits per second of serial port (autodetect=0) - - - - - Download logged fixes - - - - - Show device status - - - - - MediaTek Locus - - - - - + + First sector to be read from the device - - + + Baud rate used to init device (0=autodetect) - - + + Last sector to be read from the device (-1: smart read everything) - - + + Disable output (useful with erase) - - + + Number of sectors to read at once (0=use single sector mode) - + POI for Home Symbol as lat:lng[:alt] - + POI for Car Symbol as lat:lng[:alt] - + POI for Boat Symbol as lat:lng[:alt] - + POI for Heart Symbol as lat:lng[:alt] - + POI for Bar Symbol as lat:lng[:alt] - + MiniHomer, a skyTraq Venus 6 based logger (download tracks, waypoints and get/set POI) - + Garmin Mobile XT ([ATRK]/STRK) - + Track name processing option ([0]-nrm/1-ign) - + Mobile Garmin XT Track files - - Motoactiv CSV - - - - - MyNav TRC format - - - - - Navitel binary track (.bin) - - - - - Navitrak DNA marker format - - - - - NIMA/GNIS Geographic Names File - - - - + Accept position fixes in gpgga marked invalid - + NMEA 0183 sentences - - Compact binary representation - - - - - Nokia Landmark Exchange - - - - + OpenStreetMap data files - + Use this value as custom created_by value - + OziExplorer - + Unit used in altitude values - + Unit used in proximity values - - Raymarine Waypoint File (.rwf) - - - - - Ricoh GPS Log File - - - - - See You flight analysis data - - - - - + + Baud rate used for download - + Qstarz BL-1000 - + Video position for which exact GPS time is known (hhmmss[.sss], default is 00:00:00,000) - + GPS time at position video_time (hhmmss[.sss], default is first timestamp of track) - + GPS date at position video_time (yyyymmdd, default is first timestamp of track) - + Textual Output - - TomTom Itineraries (.itn) - - - - - TomTom POI file (.asc) - - - - - TomTom POI file (.ov2) - - - - - TrackLogs digital mapping (.trl) - - - - + Universal csv with field structure in first line - + Vcard Output (for iPod) - - - Wintec WBT-100/200 Binary File Format - - - - - Wintec WBT-100/200 GPS Download - - - - - Wintec WBT-201/G-Rays 2 Binary File Format - - - - - XAiOX iTrackU Logger - - - - - - Appends the input to a backup file - - - - - - Only waypoints that are not the backup file - - - - - XAiOX iTrackU Logger Binary File Format - - diff --git a/gui/coretool/gpsbabel_it.qm b/gui/coretool/gpsbabel_it.qm index 7fbd3e6ea..061125588 100644 Binary files a/gui/coretool/gpsbabel_it.qm and b/gui/coretool/gpsbabel_it.qm differ diff --git a/gui/coretool/gpsbabel_it.ts b/gui/coretool/gpsbabel_it.ts index 0419c25ef..10f628a3c 100644 --- a/gui/coretool/gpsbabel_it.ts +++ b/gui/coretool/gpsbabel_it.ts @@ -4,7 +4,7 @@ core - + (integer sec or 'auto') Barograph to GPS time diff (sec interi o 'auto') Differenza temporale tra barografo e GPS @@ -25,51 +25,29 @@ Nome ad-hoc icona aperta - + After output job done sleep n second(s) Attendi n secondi dopo il termine dell'elaborazione - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + Allow whitespace synth. shortnames Permetti spazi nei nomi brevi sintetizzati - + Altitudes are absolute and not clamped to ground Le quote sono assolute e non relative al terreno @@ -78,50 +56,28 @@ Aggiungi icon_descr alla descrizione - + Base URL for link tag in output Url di base per i tag link in uscita - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Basename prepended to URL on output Nome base anteposto all'URL in uscita - - + + Bitmap of categories Bitmap delle categorie @@ -130,7 +86,7 @@ Nome della categoria (cache) - + Category number to use for written waypoints Numero categoria da usare per i punti d'interesse scritti @@ -139,23 +95,22 @@ Colore per le linee o le note della mappa - - + Command unit to power itself down Chiedi al dispositivo di spegnersi - + Complete date-free tracks with given date (YYYYMMDD). Completa le tracce senza data con la data fornita (AAAAMMGG). - + Create unique waypoint names (default = yes) Crea punti d'interesse con nomi univoci (predefinito: sÃŦ) - + Create waypoints from geocache log entries Crea punti d'interesse dagli elementi nel registro geocache @@ -168,7 +123,7 @@ Nome della banca dati (nome file) - + Datum (default=NAD27) Datum (predefinito: NAD27) @@ -177,79 +132,70 @@ Giorni dopo i quali i punti sono considerati vecchi - + Decimal seconds to pause between groups of strings Pausa (in decimi di secondo) tra gruppi di stringhe - + Default category on output Categoria predefinita in uscita - + Default category on output (1..16) Categoria predefinita in uscita (1... 16) - - - - - - + + + Default icon name Nome dell'icona predefinita - Default location - Posizione predefinita + Posizione predefinita - + Default proximity Prossimità predefinita - + Default speed Velocità predefinita - Default speed for waypoints (knots/hr) - Velocità predefinita per i punti di interesse (nodi/ora) + Velocità predefinita per i punti di interesse (nodi/ora) - - + + Degrees output as 'ddd', 'dmm'(default) or 'dms' Gradi in uscita come 'ggg', 'gmm' (predefinito) o 'gms' - Delete all routes - Cancella tutte le rotte + Cancella tutte le rotte - Delete all track points - Cancella tutti i punti traccia + Cancella tutti i punti traccia - - Delete all waypoints - Cancella tutti i punti d'interesse + Cancella tutti i punti d'interesse - + Display labels on track and routepoints (default = 1) Mostra le etichette su tracce e punti rotta (predefinito: 1) - + Distance unit [m=metric, s=statute] Unità di lunghezza [m=metrico, s=statutario] @@ -259,31 +205,21 @@ - Brauniger IQ Series Barograph Download - - - - - Cambridge/Winpilot glider software - - - - Columbus/Visiontac V900 files (.csv) - + Comma separated values - + Data Logger iBlue747 csv - + Data Logger iBlue757 csv @@ -292,321 +228,230 @@ Non aggiungere url alla descrizione - - DeLorme GPL - - - - - DeLorme Street Atlas Plus - - - - - DeLorme Street Atlas Route - - - - - Destinator Itineraries (.dat) - - - - - Destinator Points of Interest (.dat) - - - - - Destinator TrackLogs (.dat) - - - - - EasyGPS binary format - - - - + Set waypoint name to source filename - + Time-frame (in seconds) - + Locate waypoint for tagging by this name - + !OVERWRITE! the original file. Default=N - + Embedded Exif-GPS data (.jpg) - - + Time zone ID - - Energympro GPS training watch - - - - - Enigma binary waypoint file (.ert) - - - - + Source for name field in .dbf - + Source for URL field in .dbf - + ESRI shapefile - - F90G Automobile DVR GPS log file - - - - + FAI/IGC Flight Recorder Data Format - + Read all points even if latitude or longitude is missing - + Attempt to recovery data from corrupt file - + Flexible and Interoperable Data Transfer (FIT) Activity file - - FlySight GPS File - - - - - Franson GPSGate Simulation - - - - - Fugawi - - - - + Garmin 301 Custom position and heartrate - + Garmin G1000 datalog input filter file - - Garmin Logbook XML - - - - + Don't create waypoints for non-user points - + Garmin MapSource - gdb - + Garmin MapSource - txt (tab delimited) - + Garmin POI database - + Don't show gpi bitmap on device Non mostrare la bitmap gpi sul dispositivo - + codec to use for writing strings - + language code to use for reading dual language files - + Garmin Points of Interest (.gpi) - + Erase existing courses when writing new ones - + Speed in bits per second of serial port (baud=9600) Velocità in bit/secondo della porta seriale (baud=4800) {9600)?} - + + override codec to use for device + + + + Garmin serial/USB protocol - + Write course rather than history, default yes - + Sport: Biking (deflt), Running, MultiSport, Other - + Garmin Training Center (.tcx/.crs/.hst/.xml) - + Geocaching.com .loc - - Geogrid-Viewer ascii overlay file (.ovl) + + Compact Output. Default is off. - - Geogrid-Viewer binary overlay file (.ovl) + + GeoJson - - Geogrid-Viewer tracklogs (.log) + + + + + Only erase device data, do not download anything - - Compact Output. Default is off. + + GlobalSat DG-100/BT-335 Download - - GeoJson - - - - - GEOnet Names Server (GNS) - - - - - - - - Only erase device data, do not download anything - - - - - GlobalSat DG-100/BT-335 Download - - - - + GlobalSat DG-200 Download - + list tracks - + get track - - - - + + + + Dump raw data to this file - + GlobalSat GH625XT GPS training watch - - Google Directions XML - - - - + Draw extrusion line from trackpoint to ground Disegna linee estruse dai punti traccia al terreno - + Drop route points that do not have an equivalent waypoint (hidden points) Ometti i punti rotta che non hanno un punto di interesse equivalente (punti nascosti) - + Enable alerts on speed or proximity distance Abilita avvisi su velocità o prossimità - - - + + + Encrypt hints using ROT13 Cripta le note usando ROT13 @@ -615,24 +460,22 @@ Cripta le note con ROT13 - - - - - - - - + + + + + + Erase device data after download Cancella i dati dal dispositivo dopo lo scaricamento - + Export linestrings for tracks and routes Esporta le linee stringa da tracce e rotte - + Export placemarks for tracks and routes Esporta segnaposti da tracce e rotte @@ -655,39 +498,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + GPS datum (def. WGS 84) Datum GPS (predefinito: WGS 84) @@ -700,25 +521,24 @@ Ignora le icone dei marcatori in fase di lettura - + Include extended data for trackpoints (default = 1) Includi dati estesi sui punti traccia (predefinito: 1) - - + + Include groundspeak logs if present Includi registri groundspeak (se presenti) - + Include major turn points (with description) from calculated route Includi i punti di svolta principali (con descrizione) dalla rotta calcolata - Include only via stations in route - Includi solo stazioni intermedie nella rotta + Includi solo stazioni intermedie nella rotta Include short name in bookmarks @@ -733,65 +553,62 @@ Indice della rotta (se nell'origine ce nè piÚ d'una) - Index of route to write (if more than one in source) - Indice della rotta da scrivere (se nell'origine ce nè piÚ d'una) + Indice della rotta da scrivere (se nell'origine ce nè piÚ d'una) Index of route/track to write (if more than one in source) Indice della rotta/traccia da scrivere (se nell'origine ce nè piÚ d'una) - Index of track (if more than one in source) - Indice della traccia (se nell'origine ce nè piÚ d'una) + Indice della traccia (se nell'origine ce nè piÚ d'una) - Index of track to write (if more than one in source) - Indice della traccia da scrivere (se nell'origine ce nè piÚ d'una) + Indice della traccia da scrivere (se nell'origine ce nè piÚ d'una) Index of URL field in .dbf Indice del campo url nel .dbf - + Indicate direction of travel in track icons (default = 0) Indica la direzione di viaggio nelle icone di traccia (predefinito: 0) - + Video position for which exact GPS time is known (hhmmss[.sss], default is 00:00:00,000) - + GPS time at position video_time (hhmmss[.sss], default is first timestamp of track) - + GPS date at position video_time (yyyymmdd, default is first timestamp of track) - + Write name(s) of format(s) from input session(s) - + Write filename(s) from input session(s) - + Universal csv with field structure in first line - + Vcard Output (for iPod) @@ -804,309 +621,203 @@ Nome icona per infrastrutture aperte - Keep turns if simplify filter is used - Mantieni le svolte se si usa il filtro di semplificazione + Mantieni le svolte se si usa il filtro di semplificazione - - + + Length of generated shortnames Lunghezza dei nomi brevi generati - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Max synthesized shortname length Length of generated shortnames (default 16) Lunghezza dei nomi brevi generati (predefinito: 16) - + Line color, specified in hex AABBGGRR Colore delle linee, indicato in esadecimale AABBVVRR - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Make synth. shortnames unique Crea nomi brevi sintetizzati univoci - + Write KML track (default = 0) - + Units used when writing comments ('s'tatute, 'm'etric,' 'n'autical, 'a'viation) - + Rotate colors for tracks and routes (default automatic) - + Precision of coordinates, number of decimals - + Google Earth (Keyhole) Markup Language - - Google Navigator Tracklines (.trl) - - - - + GPS Tracking Key Pro text - + GPS TrackMaker - + GPSBabel arc filter file - + GpsDrive Format - + GpsDrive Format for Tracks - + Add info (depth) as Humminbird extension - + Add info (depth) as Garmin extension - + Precision of elevations, number of decimals - + GPX XML - - HikeTech - - - - - Holux (gm-100) .wpo Format - - - - + Holux M-241 (MTK based) Binary File Format - - - + + Enable logging after download - - + + Size of blocks in KB to request from device - + Holux M-241 (MTK based) download - + HTML Output - + Humminbird tracks (.ht) - + Humminbird waypoints and routes (.hwr) - - IGN Rando track files - - - - - iGo Primo points of interest (.upoi) - - - - - iGO2008 points of interest (.upoi) - - - - - Track identification number - - - - - Track title - - - - - Track description - - - - - IGO8 .trk - - - - - Kompass (DAV) Track (.tk) - - - - - Kompass (DAV) Waypoints (.wp) - - - - + (USR input) Ignore event marker icons on read - + (USR output) Treat waypoints as icons on write - + (USR output) Merge into one segmented trail - + (USR input) Break segments into separate trails - + (USR output) Write version (USR input) Read version - + (USR output) Output file title string - + (USR output) Device serial number - + (USR output) Output file content description - + Lowrance USR @@ -1115,445 +826,235 @@ Versione del file TRK di MapSend da generare (3, 4) - - Magellan SD files (as for eXplorist) - - - - - Magellan SD files (as for Meridian) - - - - - Magellan serial protocol - - - - - MagicMaps IK3D project file (.ikt) - - - - - Mainnav - - - - - Map&Guide 'TourExchangeFormat' XML - - - - - MapAsia track file (.tr7) - - - - - Mapbar (China) navigation track for Sonim Xp3300 - - - - - Mapfactor Navigator - - - - - Mapopolis.com Mapconverter CSV - - - - - MapTech Exchange Format - - - - - Speed in bits per second of serial port (autodetect=0) - - - - - Download logged fixes - - - - - Show device status - - - - - MediaTek Locus - - - - - Write items 'locked' [default no] - - - - - Write items 'visible' [default yes] - - - - - Write files with internal version [n] - - - - - Memory-Map Navigator overlay files (.mmo) - - - - - Microsoft Streets and Trips 2002-2007 - - - - - + + Baud rate used for download - - + + First sector to be read from the device - - + + Baud rate used to init device (0=autodetect) - - + + Last sector to be read from the device (-1: smart read everything) - - + + Disable output (useful with erase) - - + + Number of sectors to read at once (0=use single sector mode) - + POI for Home Symbol as lat:lng[:alt] - + POI for Car Symbol as lat:lng[:alt] - + POI for Boat Symbol as lat:lng[:alt] - + POI for Heart Symbol as lat:lng[:alt] - + POI for Bar Symbol as lat:lng[:alt] - + MiniHomer, a skyTraq Venus 6 based logger (download tracks, waypoints and get/set POI) - + Garmin Mobile XT ([ATRK]/STRK) - + Track name processing option ([0]-nrm/1-ign) - + Mobile Garmin XT Track files - - Motoactiv CSV - - - - - Motorrad Routenplaner (Map&Guide) .bcr files - - - - + MTK Logger (iBlue 747,...) Binary File Format - + MTK Logger (iBlue 747,Qstarz BT-1000,...) download - - MyNav TRC format - - - - + National Geographic Topo .tpg (waypoints) - - National Geographic Topo 2.x .tpo - - - - - National Geographic Topo 3.x/4.x .tpo - - - - - Navigon Waypoints - - - - - Clear the datalog - - - - - Read from datalogger buffer - - - - - NaviGPS GT-11/BGT-11 Download - - - - - NaviGPS GT-31/BGT-31 datalogger (.sbp) - - - - - NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) - - - - - Navitel binary track (.bin) - - - - - Navitrak DNA marker format + + National Geographic Topo 2.x .tpo - - NIMA/GNIS Geographic Names File + + National Geographic Topo 3.x/4.x .tpo - + Append realtime positioning data to the output file instead of truncating - + Accept position fixes in gpgga marked invalid - + NMEA 0183 sentences - - Compact binary representation - - - - - Nokia Landmark Exchange - - - - + Use this value as custom created_by value - + OpenStreetMap data files - + Unit used in altitude values - + Unit used in proximity values - + codec to use for reading and writing strings (default windows-1252) - + OziExplorer - + Qstarz BL-1000 - - Raymarine Waypoint File (.rwf) - - - - - Ricoh GPS Log File + + Set location finder target location as lat,lng - - See You flight analysis data + + Configure logging parameter as tmin:tmax:dmin:dmax - - Set location finder target location as lat,lng + + + + Seconds that GPS time tracks UTC (0: best guess) - - Configure logging parameter as tmin:tmax:dmin:dmax + + Image Offset Time (+HH:MM or -HH:MM) - - - - Seconds that GPS time tracks UTC (0: best guess) + + Google Takeout Location History - - - + + + GPS week rollover period we're in (-1: best guess) - + SkyTraq Venus based loggers (download) - + First sector to be read from the file - + Last sector to be read from the file (-1: read till empty sector) - + SkyTraq Venus based loggers Binary File Format - + Format for subtitles - + SubRip subtitles for video mapping (.srt) - - Swiss Map 25/50/100 (.xol) - - - - + Tab delimited fields useful for OpenOffice - - Teletype [ Get Jonathon Johnson to describe - - - - + Textual Output - - - TomTom Itineraries (.itn) - - - - - TomTom Places Itineraries (.itn) - - - - - TomTom POI file (.asc) - - - - - TomTom POI file (.ov2) - - - - - TrackLogs digital mapping (.trl) - - Margin for map. Degrees or percentage Margine della mappa. Gradi o percentuale @@ -1571,68 +1072,27 @@ Tipo di marcatore per i punti non trovati - + Max length of waypoint name to write Lunghezza massima dei nomi dei punti d'interesse da scrivere - - - Max number of comments to write (maxcmts=200) - Numero massimo di commenti da scrivere (maxcmts=200) + Numero massimo di commenti da scrivere (maxcmts=200) Max shortname length when used with -s Lunghezza massima dei nomi brevi quando si usa -s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Max synthesized shortname length - Lunghezza massima dei nomi brevi sintetizzati - Merge output with existing file Unisci la destinazione con un file esistente - - - - + + + + MTK compatible CSV output file File di destinazione CVS compatibile con MTK @@ -1641,16 +1101,15 @@ Nome della categoria 'Non assegnato' - New name for the route - Nuovo nome della rotta + Nuovo nome della rotta No separator lines between waypoints Nessuna linea di separazione tra punti d'interesse - + No whitespace in generated shortnames Nessuno spazio nei nomi brevi generati @@ -1663,32 +1122,30 @@ Nome dell'icona non nascosta/non codificata - Numeric value of bitrate (baud=4800) - Valore numerico del bitrate (baud=4800) + Valore numerico del bitrate (baud=4800) - + Omit Placer name Ometti nome localizzatore - Only read turns; skip all other points - Leggi solo le svolte; tralascia tutti gli altri punti + Leggi solo le svolte; tralascia tutti gli altri punti - + Path to HTML style sheet Percorso del foglio di stile html - + Precision of coordinates Precisione delle coordinate - + Proximity distance Distanza di prossimità @@ -1697,57 +1154,55 @@ Raggio dei cerchi - Radius of our big earth (default 6371000 meters) - Raggio della Terra (predefinito: 6371000 metri) + Raggio della Terra (predefinito: 6371000 metri) - Read control points as waypoint/route/none - Leggi i punti di controllo come punti di interesse/rotte/nessuno + Leggi i punti di controllo come punti di interesse/rotte/nessuno Read/Write date format (i.e. DDMMYYYY) Formato data in lettura/scrittura (per es. DDMMYYYY) - + Read/Write date format (i.e. yyyy/mm/dd) Formato data in lettura/scrittura (per es. yyyy/mm/dd) - + Read/write GPGGA sentences Leggi/scrivi frasi GPGGA - + Read/write GPGSA sentences Leggi/scrivi frasi GPGSA - + Read/write GPRMC sentences Leggi/scrivi frasi GPRMC - + Read/write GPVTG sentences Leggi/scrivi frasi GPVTG - + Read/Write time format (i.e. HH:mm:ss xx) Formato ora in lettura/scrittura (per es. HH:mm:ss xx) - + Retain at most this number of position points (0 = unlimited) Mantieni almeno questo numero di punti posizione (0 = illimitati) - - + + Return current position as a waypoint Ritorna la posizione corrente sotto forma di punto d'interesse @@ -1764,19 +1219,17 @@ Il nome breve è un indirizzo MAC - + Speed in bits per second of serial port (baud=4800) Velocità in bit/secondo della porta seriale (baud=4800) - Split input into separate files - Suddividi l'ingresso in piÚ file separati + Suddividi l'ingresso in piÚ file separati - Split into multiple routes at turns - Suddividi in piÚ rotte alle svolte + Suddividi in piÚ rotte alle svolte Starting seed of the internal number generator @@ -1790,48 +1243,6 @@ Stealth non-encrypted icon name Nome dell'icona nascosta/non codificata - - - Wintec TES file - - - - - Wintec WBT-100/200 Binary File Format - - - - - Wintec WBT-100/200 GPS Download - - - - - Wintec WBT-201/G-Rays 2 Binary File Format - - - - - - Appends the input to a backup file - - - - - - Only waypoints that are not the backup file - - - - - XAiOX iTrackU Logger - - - - - XAiOX iTrackU Logger Binary File Format - - String to separate concatenated address fields (default=", ") Stringa per separare i campi indirizzo concatenati (predefinito: ", ") @@ -1845,14 +1256,13 @@ Ometti i geocache obsoleti - + Suppress separator lines between waypoints Ometti le linee di separazione tra punti d'interesse - Suppress use of handshaking in name of speed - Ometti l'uso dell'handshake per aumentare la velocità + Ometti l'uso dell'handshake per aumentare la velocità Suppress whitespace in generated shortnames @@ -1863,22 +1273,21 @@ Simbolo da usare per i punti - + Sync GPS time to computer time Sincronizza l'ora del GPS con quella del computer - Synthesize track times - Sintetizza gli orari delle tracce + Sintetizza gli orari delle tracce - + Target GPX version for output Versione GPX del file di destinazione - + Temperature unit [c=Celsius, f=Fahrenheit] Unità di temperatura [c=Celsius, f=Fahrenheit] @@ -1895,13 +1304,13 @@ Tipo del file .an1 - - + + Units for altitude (f)eet or (m)etres Unità di misura della quota [m: metri, f: piedi] - + Units used for names with @speed ('s'tatute or 'm'etric) Untià di misura per nomi con @speed [m: metrico, s: statutario] @@ -1912,38 +1321,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + UPPERCASE synth. shortnames Nomi brevi sintetizzati in MAIUSCOLO @@ -1958,48 +1345,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Use shortname instead of description Usa il nome breve invece della descrizione - + Use specified bitmap on output Usa la bitmap specificata nella destinazione - + Version of gdb file to generate (1..3) Versione del file gdb da generare (1... 3) @@ -2008,12 +1372,12 @@ Versione del file MapSource da generare (3, 4, 5) - + Waypoint background color Colore di sfondo dei punti d'interesse - + Waypoint foreground color Colore dei punti d'interesse @@ -2026,54 +1390,65 @@ Larghezza della mappa, in pixel - + Width of lines, in pixels Larghezza delle linee, in pixel - + Write additional node tag key/value pairs Scrivi coppie addizionali di tag chiave/valore per i nodi - + Write additional way tag key/value pairs Scrivi coppie addizionali di tag chiave/valore per le vie - + Write all tracks into one file Scrivi tutte le tracce in un solo file - + Write description to address field Scrivi la descrizione nel campo indirizzo - + Write each waypoint in a separate file Scrivi ciascun punto d'interesse in un file separato - + Write notes to address field Scrivi le note nel campo indirizzo - + Write position to address field Scrivi la posizione del campo indirizzo - - + + Write position using this grid. Scrivi la posizione usando questa griglia. - - + + + + + + + + + + + + + Write timestamps with offset x to UTC time Scrivi date e ore con scostamento X rispetto al tempo UTC @@ -2082,7 +1457,7 @@ Scrivi tracce compatibili con Carto Exploreur - + Write tracks for Gisteq Phototracker Scrivi tracce per Gisteq Phototracker diff --git a/gui/coretool/gpsbabel_ru.qm b/gui/coretool/gpsbabel_ru.qm index c6666caf6..9181089ff 100644 Binary files a/gui/coretool/gpsbabel_ru.qm and b/gui/coretool/gpsbabel_ru.qm differ diff --git a/gui/coretool/gpsbabel_ru.ts b/gui/coretool/gpsbabel_ru.ts index 9c1d7e467..cbca2ad84 100644 --- a/gui/coretool/gpsbabel_ru.ts +++ b/gui/coretool/gpsbabel_ru.ts @@ -4,1808 +4,1561 @@ core - Brauniger IQ Series Barograph Download - ЗаĐŗŅ€ŅƒĐˇĐēĐ° йаŅ€ĐžĐŗŅ€Đ°Ņ„Đ° Brauniger ŅĐĩŅ€Đ¸Đ¸ IQ + ЗаĐŗŅ€ŅƒĐˇĐēĐ° йаŅ€ĐžĐŗŅ€Đ°Ņ„Đ° Brauniger ŅĐĩŅ€Đ¸Đ¸ IQ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Max synthesized shortname length МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐ°Ņ Đ´ĐģиĐŊĐ° ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩĐŧŅ‹Ņ… ĐēĐžŅ€ĐžŅ‚ĐēиŅ… ĐŊаСваĐŊиК - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + Allow whitespace synth. shortnames РаСŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐąĐĩĐģŅ‹ в ĐēĐžŅ€ĐžŅ‚ĐēиŅ… ĐŊаСваĐŊиŅŅ… - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + UPPERCASE synth. shortnames ХОСдаваŅ‚ŅŒ ĐēĐžŅ€ĐžŅ‚ĐēиĐĩ ĐŊаСваĐŊиŅ в ВЕРĐĨНЕМ РЕГИСĐĸРЕ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + Make synth. shortnames unique ДĐĩĐģĐ°Ņ‚ŅŒ ĐēĐžŅ€ĐžŅ‚ĐēиĐĩ ĐŊаСваĐŊиŅ ŅƒĐŊиĐēĐ°ĐģŅŒĐŊŅ‹Đŧи - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Basename prepended to URL on output ДобавĐģŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´ URL-Đ°Đ´Ņ€ĐĩŅĐžĐŧ йаСОвОĐĩ иĐŧŅ ĐŋŅ€Đ¸ вŅ‹Đ˛ĐžĐ´Đĩ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Use shortname instead of description ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ĐēĐžŅ€ĐžŅ‚ĐēĐžĐĩ ĐŊаСваĐŊиĐĩ вĐŧĐĩŅŅ‚Đž ĐžĐŋиŅĐ°ĐŊиŅ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + GPS datum (def. WGS 84) ХиŅŅ‚ĐĩĐŧĐ° ĐēООŅ€Đ´Đ¸ĐŊĐ°Ņ‚ GPS (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: WGS 84) - Cambridge/Winpilot glider software - ПО ĐŋĐģĐ°ĐŊĐĩŅ€Đ° Cambridge/Winpilot + ПО ĐŋĐģĐ°ĐŊĐĩŅ€Đ° Cambridge/Winpilot - + Columbus/Visiontac V900 files (.csv) ФаКĐģŅ‹ Columbus/Visiontac V900 (.csv) - + Comma separated values ЗĐŊĐ°Ņ‡ĐĩĐŊиŅ, Ņ€Đ°ĐˇĐ´ĐĩĐģŅ‘ĐŊĐŊŅ‹Đĩ СаĐŋŅŅ‚Ņ‹Đŧи - - - - - - + + + Default icon name ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊŅ‹Đš СĐŊĐ°Ņ‡ĐžĐē - + Data Logger iBlue747 csv ĐĄŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… iBlue747 (.csv) - + Data Logger iBlue757 csv ĐĄŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… iBlue757 (.csv) - DeLorme GPL - DeLorme GPL + DeLorme GPL - DeLorme Street Atlas Plus - DeLorme Street Atlas Plus + DeLorme Street Atlas Plus - Keep turns if simplify filter is used - ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ ĐŋОвОŅ€ĐžŅ‚Ņ‹ ĐŋŅ€Đ¸ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии Ņ„иĐģŅŒŅ‚Ņ€Đ° ŅƒĐŋŅ€ĐžŅ‰ĐĩĐŊиŅ + ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ ĐŋОвОŅ€ĐžŅ‚Ņ‹ ĐŋŅ€Đ¸ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии Ņ„иĐģŅŒŅ‚Ņ€Đ° ŅƒĐŋŅ€ĐžŅ‰ĐĩĐŊиŅ - Only read turns; skip all other points - ЧиŅ‚Đ°Ņ‚ŅŒ Ņ‚ĐžĐģŅŒĐēĐž ĐŋОвОŅ€ĐžŅ‚Ņ‹ и ĐŋŅ€ĐžĐŋŅƒŅĐēĐ°Ņ‚ŅŒ вŅĐĩ ĐžŅŅ‚Đ°ĐģŅŒĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи + ЧиŅ‚Đ°Ņ‚ŅŒ Ņ‚ĐžĐģŅŒĐēĐž ĐŋОвОŅ€ĐžŅ‚Ņ‹ и ĐŋŅ€ĐžĐŋŅƒŅĐēĐ°Ņ‚ŅŒ вŅĐĩ ĐžŅŅ‚Đ°ĐģŅŒĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи - Split into multiple routes at turns - РаСдĐĩĐģŅŅ‚ŅŒ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ ĐŊĐ° ĐŋОвОŅ€ĐžŅ‚Đ°Ņ… + РаСдĐĩĐģŅŅ‚ŅŒ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ ĐŊĐ° ĐŋОвОŅ€ĐžŅ‚Đ°Ņ… - Read control points as waypoint/route/none - ЧиŅ‚Đ°Ņ‚ŅŒ ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŒĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ĐēĐ°Đē ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅƒŅŽ Ņ‚ĐžŅ‡ĐēŅƒ/ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚/ĐŊиŅ‡ĐĩĐŗĐž + ЧиŅ‚Đ°Ņ‚ŅŒ ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŒĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ĐēĐ°Đē ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅƒŅŽ Ņ‚ĐžŅ‡ĐēŅƒ/ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚/ĐŊиŅ‡ĐĩĐŗĐž - Synthesize track times - ГĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ вŅ€ĐĩĐŧŅ Ņ‚Ņ€ĐĩĐēОв + ГĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ вŅ€ĐĩĐŧŅ Ņ‚Ņ€ĐĩĐēОв - DeLorme Street Atlas Route - МаŅ€ŅˆŅ€ŅƒŅ‚ DeLorme Street Atlas + МаŅ€ŅˆŅ€ŅƒŅ‚ DeLorme Street Atlas - Destinator Itineraries (.dat) - МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ Destinator (.dat) + МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ Destinator (.dat) - Destinator Points of Interest (.dat) - ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и Destinator (.dat) + ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и Destinator (.dat) - Destinator TrackLogs (.dat) - ЖŅƒŅ€ĐŊĐ°ĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв Destinator (.dat) + ЖŅƒŅ€ĐŊĐ°ĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв Destinator (.dat) - EasyGPS binary format - ДвоиŅ‡ĐŊŅ‹Đš Ņ„ĐžŅ€ĐŧĐ°Ņ‚ EasyGPS + ДвоиŅ‡ĐŊŅ‹Đš Ņ„ĐžŅ€ĐŧĐ°Ņ‚ EasyGPS - + Set waypoint name to source filename ЗадаваŅ‚ŅŒ иĐŧŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊОК Ņ‚ĐžŅ‡Đēи ĐŊĐ° ĐžŅĐŊОвĐĩ иĐŧĐĩĐŊи вŅ…ОдĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģĐ° - + Time-frame (in seconds) ИĐŊŅ‚ĐĩŅ€Đ˛Đ°Đģ вŅ€ĐĩĐŧĐĩĐŊи (в ŅĐĩĐēŅƒĐŊĐ´Đ°Ņ…) - + Locate waypoint for tagging by this name НайŅ‚и ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅƒŅŽ Ņ‚ĐžŅ‡ĐēŅƒ Đ´ĐģŅ ĐŋĐžĐŧĐĩŅ‚Đēи ŅŅ‚иĐŧ иĐŧĐĩĐŊĐĩĐŧ - + !OVERWRITE! the original file. Default=N !ПЕРЕЗАПИСАĐĸĐŦ! иŅŅ…ОдĐŊŅ‹Đš Ņ„Đ°ĐšĐģ. По ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ=N - + Embedded Exif-GPS data (.jpg) ВŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ Exif-GPS (.jpg) - - + Time zone ID ИдĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ‚ĐžŅ€ Ņ‡Đ°ŅĐžĐ˛ĐžĐŗĐž ĐŋĐžŅŅĐ° - Energympro GPS training watch - ĐĄĐŋĐžŅ€Ņ‚ивĐŊŅ‹Đĩ Ņ‡Đ°ŅŅ‹ Energympro GPS + ĐĄĐŋĐžŅ€Ņ‚ивĐŊŅ‹Đĩ Ņ‡Đ°ŅŅ‹ Energympro GPS - Enigma binary waypoint file (.ert) - ДвоиŅ‡ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē Enigma (.ert) + ДвоиŅ‡ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē Enigma (.ert) - + Source for name field in .dbf ИŅŅ‚ĐžŅ‡ĐŊиĐē Đ´ĐģŅ ĐŋĐžĐģŅ иĐŧĐĩĐŊи в .dbf - + Source for URL field in .dbf ИŅŅ‚ĐžŅ‡ĐŊиĐē Đ´ĐģŅ ĐŋĐžĐģŅ URL-Đ°Đ´Ņ€ĐĩŅĐ° в .dbf - + ESRI shapefile ФаКĐģ Ņ„ĐžŅ€ĐŧŅ‹ ESRI - F90G Automobile DVR GPS log file - ФаКĐģ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° F90G Automobile DVR GPS + ФаКĐģ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° F90G Automobile DVR GPS - + (integer sec or 'auto') Barograph to GPS time diff РаСĐŊиŅ†Đ° вО вŅ€ĐĩĐŧĐĩĐŊи ĐŧĐĩĐļĐ´Ņƒ йаŅ€ĐžĐŗŅ€Đ°Ņ„ĐžĐŧ и GPS (Ņ†ĐĩĐģŅ‹Đĩ ŅĐĩĐēŅƒĐŊĐ´Ņ‹ иĐģи "авŅ‚Đž") - + FAI/IGC Flight Recorder Data Format ФОŅ€ĐŧĐ°Ņ‚ Đ´Đ°ĐŊĐŊŅ‹Ņ… йОŅ€Ņ‚ОвОĐŗĐž Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° FAI/IGC - + Read all points even if latitude or longitude is missing ЧиŅ‚Đ°Ņ‚ŅŒ вŅĐĩ Ņ‚ĐžŅ‡Đēи, Đ´Đ°ĐļĐĩ ĐĩŅĐģи ĐžŅ‚ŅŅƒŅ‚ŅŅ‚вŅƒĐĩŅ‚ ŅˆĐ¸Ņ€ĐžŅ‚Đ° иĐģи Đ´ĐžĐģĐŗĐžŅ‚Đ° - + Attempt to recovery data from corrupt file ПŅ‹Ņ‚Đ°Ņ‚ŅŒŅŅ вОŅŅŅ‚Đ°ĐŊОвиŅ‚ŅŒ Đ´Đ°ĐŊĐŊŅ‹Đĩ иС ĐŋОвŅ€ĐĩĐļĐ´Ņ‘ĐŊĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģĐ° - + Flexible and Interoperable Data Transfer (FIT) Activity file ФаКĐģ Đ°ĐēŅ‚ивĐŊĐžŅŅ‚и Flexible and Interoperable Data Transfer (FIT) - FlySight GPS File - ФаКĐģ FlySight GPS + ФаКĐģ FlySight GPS - Default speed for waypoints (knots/hr) - ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ Đ´ĐģŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē (ŅƒĐˇĐģОв/Ņ‡) + ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ Đ´ĐģŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē (ŅƒĐˇĐģОв/Ņ‡) - Split input into separate files - РаСдĐĩĐģŅŅ‚ŅŒ вŅ…ОдĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ ĐŊĐ° ĐžŅ‚Đ´ĐĩĐģŅŒĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ + РаСдĐĩĐģŅŅ‚ŅŒ вŅ…ОдĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ ĐŊĐ° ĐžŅ‚Đ´ĐĩĐģŅŒĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹ - Franson GPSGate Simulation - ХиĐŧŅƒĐģŅŅ†Đ¸Ņ Franson GPSGate + ХиĐŧŅƒĐģŅŅ†Đ¸Ņ Franson GPSGate - Fugawi - Fugawi + Fugawi - + Garmin 301 Custom position and heartrate ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅŒŅĐēĐžĐĩ ĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ и Ņ‡Đ°ŅŅ‚ĐžŅ‚Đ° ŅĐĩŅ€Đ´ĐĩŅ‡ĐŊŅ‹Ņ… ŅĐžĐēŅ€Đ°Ņ‰ĐĩĐŊиК Garmin 301 - + Garmin G1000 datalog input filter file ФаКĐģ вŅ…ОдĐŊĐžĐŗĐž Ņ„иĐģŅŒŅ‚Ņ€Đ° ĐļŅƒŅ€ĐŊĐ°ĐģĐ° Đ´Đ°ĐŊĐŊŅ‹Ņ… Garmin G1000 - Garmin Logbook XML - Garmin Logbook XML + Garmin Logbook XML - + Default category on output (1..16) ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐ°Ņ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Ņ ĐŋŅ€Đ¸ вŅ‹Đ˛ĐžĐ´Đĩ (1..16) - - + + Bitmap of categories БиŅ‚ОваŅ ĐēĐ°Ņ€Ņ‚Đ° ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đš - + Version of gdb file to generate (1..3) ВĐĩŅ€ŅĐ¸Ņ GDB (1..3) - + Drop route points that do not have an equivalent waypoint (hidden points) ĐŖĐ´Đ°ĐģиŅ‚ŅŒ ĐŋŅƒŅ‚ĐĩвŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ĐąĐĩС ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒŅŽŅ‰ĐĩĐš ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊОК Ņ‚ĐžŅ‡Đēи (ŅĐēŅ€Ņ‹Ņ‚Ņ‹Đĩ Ņ‚ĐžŅ‡Đēи) - + Don't create waypoints for non-user points НĐĩ ŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи Đ´ĐģŅ ĐŊĐĩĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅŒŅĐēиŅ… Ņ‚ĐžŅ‡ĐĩĐē - + Include major turn points (with description) from calculated route ВĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ ĐžŅĐŊОвĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ĐŋОвОŅ€ĐžŅ‚Đ° (Ņ ĐžĐŋиŅĐ°ĐŊиĐĩĐŧ) иС Ņ€Đ°ŅŅŅ‡Đ¸Ņ‚Đ°ĐŊĐŊĐžĐŗĐž ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° - + Garmin MapSource - gdb Garmin MapSource — gdb - - + + Length of generated shortnames ДĐģиĐŊĐ° ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩĐŧŅ‹Ņ… ĐēĐžŅ€ĐžŅ‚ĐēиŅ… ĐŊаСваĐŊиК - + Read/Write date format (i.e. yyyy/mm/dd) ФОŅ€ĐŧĐ°Ņ‚ Đ´Đ°Ņ‚Ņ‹ Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ/СаĐŋиŅĐ¸ (ĐŊĐ°ĐŋŅ€Đ¸ĐŧĐĩŅ€, ĐŗĐŗĐŗĐŗ/ĐŧĐŧ/Đ´Đ´) - + Distance unit [m=metric, s=statute] ЕдиĐŊиŅ†Đ° Ņ€Đ°ŅŅŅ‚ĐžŅĐŊиŅ [m=ĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩŅĐēĐ°Ņ, s=Đ°ĐŊĐŗĐģиКŅĐēĐ°Ņ] - - + + Write position using this grid. ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Ņ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩĐŧ ŅŅ‚ОК ŅĐĩŅ‚Đēи. - + Precision of coordinates ĐĸĐžŅ‡ĐŊĐžŅŅ‚ŅŒ ĐēООŅ€Đ´Đ¸ĐŊĐ°Ņ‚ - + Temperature unit [c=Celsius, f=Fahrenheit] ЕдиĐŊиŅ†Đ° Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Ņ‹ [c=ĐĻĐĩĐģŅŒŅĐ¸Đš, f=ФаŅ€ĐĩĐŊĐŗĐĩĐšŅ‚] - + Read/Write time format (i.e. HH:mm:ss xx) ФОŅ€ĐŧĐ°Ņ‚ вŅ€ĐĩĐŧĐĩĐŊи Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ/СаĐŋиŅĐ¸ (ĐŊĐ°ĐŋŅ€Đ¸ĐŧĐĩŅ€, ЧЧ:ĐŧĐŧ:ŅŅ ĐēĐ°Đ´Ņ€Ņ‹) - - + + + + + + + + + + + + + Write timestamps with offset x to UTC time ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ вŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ ĐŧĐĩŅ‚Đēи ŅĐž ŅĐŧĐĩŅ‰ĐĩĐŊиĐĩĐŧ x ĐžŅ‚ĐŊĐžŅĐ¸Ņ‚ĐĩĐģŅŒĐŊĐž вŅ€ĐĩĐŧĐĩĐŊи в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ UTC - + + Image Offset Time (+HH:MM or -HH:MM) + ВŅ€ĐĩĐŧŅ ŅĐŧĐĩŅ‰ĐĩĐŊиŅ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиŅ (+ЧЧ:ММ иĐģи -ЧЧ:ММ) + + + Garmin MapSource - txt (tab delimited) Garmin MapSource — txt (Ņ Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊиĐĩĐŧ Ņ‚Đ°ĐąŅƒĐģŅŅ†Đ¸ĐĩĐš) - + Garmin POI database База Đ´Đ°ĐŊĐŊŅ‹Ņ… Đ´ĐžŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚ĐĩĐš Garmin - + Enable alerts on speed or proximity distance ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐžĐŋОвĐĩŅ‰ĐĩĐŊиŅ Đ´ĐģŅ ŅĐēĐžŅ€ĐžŅŅ‚и иĐģи Ņ€Đ°ŅŅŅ‚ĐžŅĐŊиŅ ĐąĐģиСОŅŅ‚и - + Use specified bitmap on output ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅƒĐēаСаĐŊĐŊŅƒŅŽ йиŅ‚ОвŅƒŅŽ ĐēĐ°Ņ€Ņ‚Ņƒ ĐŋŅ€Đ¸ вŅ‹Đ˛ĐžĐ´Đĩ - + Default category on output ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐ°Ņ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Ņ ĐŋŅ€Đ¸ вŅ‹Đ˛ĐžĐ´Đĩ - + Don't show gpi bitmap on device НĐĩ ĐŋĐžĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ йиŅ‚ОвŅƒŅŽ ĐēĐ°Ņ€Ņ‚Ņƒ gpi ĐŊĐ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚вĐĩ - + Write description to address field ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐžĐŋиŅĐ°ĐŊиĐĩ в ĐŋĐžĐģĐĩ Đ°Đ´Ņ€ĐĩŅĐ° - + Write notes to address field ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ СаĐŧĐĩŅ‚Đēи в ĐŋĐžĐģĐĩ Đ°Đ´Ņ€ĐĩŅĐ° - + Write position to address field ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ в ĐŋĐžĐģĐĩ Đ°Đ´Ņ€ĐĩŅĐ° - + Default proximity ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐĩ ĐŋŅ€Đ¸ĐąĐģиĐļĐĩĐŊиĐĩ - + After output job done sleep n second(s) ПоŅĐģĐĩ вŅ‹ĐŋĐžĐģĐŊĐĩĐŊиŅ СадаĐŊиŅ вŅ‹Đ˛ĐžĐ´Đ° ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ ĐŋĐ°ŅƒĐˇŅƒ n (в ŅĐĩĐēŅƒĐŊĐ´Đ°Ņ…) - + Default speed ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐ°Ņ ŅĐēĐžŅ€ĐžŅŅ‚ŅŒ - + Create unique waypoint names (default = yes) ХОСдаваŅ‚ŅŒ ŅƒĐŊиĐēĐ°ĐģŅŒĐŊŅ‹Đĩ иĐŧĐĩĐŊĐ° ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ = yes) - + Units used for names with @speed ('s'tatute or 'm'etric) ЕдиĐŊиŅ†Ņ‹ иСĐŧĐĩŅ€ĐĩĐŊиŅ ŅĐēĐžŅ€ĐžŅŅ‚и ('s' — Đ°ĐŊĐŗĐģиКŅĐēиĐĩ иĐģи 'm' — ĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩŅĐēиĐĩ) - + codec to use for writing strings ĐēОдĐĩĐē, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš иŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ СаĐŋиŅĐ¸ ŅŅ‚Ņ€ĐžĐē - + language code to use for reading dual language files ĐēОд ŅĐˇŅ‹ĐēĐ°, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš иŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ двŅƒŅĐˇŅ‹Ņ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв - + Garmin Points of Interest (.gpi) ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и Garmin (.gpi) - - + + Return current position as a waypoint ВозвŅ€Đ°Ņ‰Đ°Ņ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐĩ ĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ ĐēĐ°Đē ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅƒŅŽ Ņ‚ĐžŅ‡ĐēŅƒ - - + Command unit to power itself down ОŅ‚даваŅ‚ŅŒ ĐŧОдŅƒĐģŅŽ ĐēĐžĐŧĐ°ĐŊĐ´Ņƒ ĐŊĐ° ŅĐ°ĐŧОвŅ‹ĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ - + Erase existing courses when writing new ones ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ ŅŅƒŅ‰ĐĩŅŅ‚вŅƒŅŽŅ‰Đ¸Đĩ ĐēŅƒŅ€ŅŅ‹ ĐŋŅ€Đ¸ СаĐŋиŅĐ¸ ĐŊОвŅ‹Ņ… - + Sync GPS time to computer time ХиĐŊŅ…Ņ€ĐžĐŊиСиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ вŅ€ĐĩĐŧŅ GPS Ņ вŅ€ĐĩĐŧĐĩĐŊĐĩĐŧ ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đ° - + Category number to use for written waypoints НоĐŧĐĩŅ€ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸ Đ´ĐģŅ СаĐŋиŅĐ°ĐŊĐŊŅ‹Ņ… ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē - + Speed in bits per second of serial port (baud=9600) ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžĐŗĐž ĐŋĐžŅ€Ņ‚Đ° в йиŅ‚Đ°Ņ… в ŅĐĩĐēŅƒĐŊĐ´Ņƒ (baud=9600) - + + override codec to use for device + ĐŋĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģиŅ‚ŅŒ ĐēОдĐĩĐē Đ´ĐģŅ ŅŅ‚ĐžĐŗĐž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва + + + Garmin serial/USB protocol ПоŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊŅ‹Đš/USB-ĐŋŅ€ĐžŅ‚ĐžĐēĐžĐģ Garmin - + Write course rather than history, default yes ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēŅƒŅ€Ņ, Đ° ĐŊĐĩ ĐļŅƒŅ€ĐŊĐ°Đģ, ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: Đ´Đ° - + Sport: Biking (deflt), Running, MultiSport, Other ВидŅ‹ ŅĐŋĐžŅ€Ņ‚Đ°: вĐĩĐģĐžŅĐŋĐžŅ€Ņ‚ (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ), ĐąĐĩĐŗ, Ņ€Đ°ĐˇĐģиŅ‡ĐŊŅ‹Đĩ видŅ‹ ŅĐŋĐžŅ€Ņ‚Đ°, Đ´Ņ€ŅƒĐŗĐžĐĩ - + Garmin Training Center (.tcx/.crs/.hst/.xml) ĐĸŅ€ĐĩĐŊиŅ€ĐžĐ˛ĐžŅ‡ĐŊŅ‹Đš Ņ†ĐĩĐŊŅ‚Ņ€ Garmin (.tcx/.crs/.hst/.xml) - + Omit Placer name ОĐŋŅƒŅĐēĐ°Ņ‚ŅŒ иĐŧŅ Ņ€Đ°ĐˇĐŧĐĩŅŅ‚ивŅˆĐĩĐŗĐž - + Geocaching.com .loc Geocaching.com .loc - Geogrid-Viewer ascii overlay file (.ovl) - ASCII-Ņ„Đ°ĐšĐģ ĐŊĐ°ĐģĐžĐļĐĩĐŊиŅ Geogrid Viewer (.ovl) + ASCII-Ņ„Đ°ĐšĐģ ĐŊĐ°ĐģĐžĐļĐĩĐŊиŅ Geogrid Viewer (.ovl) - Geogrid-Viewer binary overlay file (.ovl) - ДвоиŅ‡ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐŊĐ°ĐģĐžĐļĐĩĐŊиŅ Geogrid Viewer (.ovl) + ДвоиŅ‡ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐŊĐ°ĐģĐžĐļĐĩĐŊиŅ Geogrid Viewer (.ovl) - Geogrid-Viewer tracklogs (.log) - ЖŅƒŅ€ĐŊĐ°ĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв Geogrid-Viewer (.log) + ЖŅƒŅ€ĐŊĐ°ĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв Geogrid-Viewer (.log) - + Compact Output. Default is off. КоĐŧĐŋĐ°ĐēŅ‚ĐŊŅ‹Đš вŅ‹Đ˛ĐžĐ´. По ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐž. - + GeoJson GeoJson - GEOnet Names Server (GNS) - ĐĄĐĩŅ€Đ˛ĐĩŅ€ иĐŧŅ‘ĐŊ GEOnet (GNS) + ĐĄĐĩŅ€Đ˛ĐĩŅ€ иĐŧŅ‘ĐŊ GEOnet (GNS) - - - - - - - - + + + + + + Erase device data after download ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ Đ´Đ°ĐŊĐŊŅ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва ĐŋĐžŅĐģĐĩ СаĐŗŅ€ŅƒĐˇĐēи - - - - + + + + Only erase device data, do not download anything ĐĸĐžĐģŅŒĐēĐž ŅƒĐ´Đ°ĐģŅŅ‚ŅŒ Đ´Đ°ĐŊĐŊŅ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва, ĐŊиŅ‡ĐĩĐŗĐž ĐŊĐĩ СаĐŗŅ€ŅƒĐļĐ°Ņ‚ŅŒ - + GlobalSat DG-100/BT-335 Download ЗаĐŗŅ€ŅƒĐˇĐēĐ° GlobalSat DG-100/BT-335 - + GlobalSat DG-200 Download ЗаĐŗŅ€ŅƒĐˇĐēĐ° GlobalSat DG-200 - + list tracks вŅ‹Đ˛ĐĩŅŅ‚и Ņ‚Ņ€ĐĩĐēи - + get track ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Ņ‚Ņ€ĐĩĐē - - - - + + + + Dump raw data to this file ЗаĐŋиŅĐ°Ņ‚ŅŒ Đ´Đ°ĐŧĐŋ ĐŊĐĩОйŅ€Đ°ĐąĐžŅ‚Đ°ĐŊĐŊŅ‹Ņ… Đ´Đ°ĐŊĐŊŅ‹Ņ… в ŅŅ‚ĐžŅ‚ Ņ„Đ°ĐšĐģ - + GlobalSat GH625XT GPS training watch ĐĄĐŋĐžŅ€Ņ‚ивĐŊŅ‹Đĩ Ņ‡Đ°ŅŅ‹ GlobalSat GH625XT GPS - Google Directions XML - Google Directions XML + Google Directions XML - + Export linestrings for tracks and routes Đ­ĐēŅĐŋĐžŅ€Ņ‚иŅ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´Đ°ĐŊĐŊŅ‹Đĩ ĐģиĐŊиК Đ´ĐģŅ Ņ‚Ņ€ĐĩĐēОв и ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ов - + Export placemarks for tracks and routes Đ­ĐēŅĐŋĐžŅ€Ņ‚иŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐĩŅ‚Đēи ĐŧĐĩŅŅ‚ Đ´ĐģŅ Ņ‚Ņ€ĐĩĐēОв и ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ов - + Width of lines, in pixels ШиŅ€Đ¸ĐŊĐ° ĐģиĐŊиК, в ĐŋиĐēŅĐĩĐģĐ°Ņ… - + Line color, specified in hex AABBGGRR ĐĻвĐĩŅ‚ ĐģиĐŊии (ŅˆĐĩŅŅ‚ĐŊĐ°Đ´Ņ†Đ°Ņ‚ĐĩŅ€Đ¸Ņ‡ĐŊĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ AABBGGRR) - + Altitudes are absolute and not clamped to ground ВŅ‹ŅĐžŅ‚Ņ‹ Đ°ĐąŅĐžĐģŅŽŅ‚ĐŊŅ‹ и ĐŊĐĩ ĐŋŅ€Đ¸Đ˛ŅĐˇĐ°ĐŊŅ‹ Đē СĐĩĐŧĐģĐĩ - + Draw extrusion line from trackpoint to ground РиŅĐžĐ˛Đ°Ņ‚ŅŒ ŅĐžĐĩдиĐŊиŅ‚ĐĩĐģŅŒĐŊŅƒŅŽ ĐģиĐŊиŅŽ ĐžŅ‚ Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēĐ° Đ´Đž СĐĩĐŧĐģи - + Write KML track (default = 0) ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ‚Ņ€ĐĩĐē KML (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ = 0) - + Include extended data for trackpoints (default = 1) ВĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ Đ´ĐģŅ Ņ‚ĐžŅ‡ĐĩĐē Ņ‚Ņ€ĐĩĐēОв (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ = 1) - + Indicate direction of travel in track icons (default = 0) ĐŖĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŊĐ°ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ двиĐļĐĩĐŊиŅ ĐŊĐ° СĐŊĐ°Ņ‡ĐēĐ°Ņ… Ņ‚Ņ€ĐĩĐēОв (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ = 0) - + Units used when writing comments ('s'tatute, 'm'etric,' 'n'autical, 'a'viation) ЕдиĐŊиŅ†Ņ‹, иŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đĩ ĐŋŅ€Đ¸ ĐŊĐ°ĐŋиŅĐ°ĐŊии ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đĩв ('s' — Đ°ĐŊĐŗĐģиКŅĐēиĐĩ, 'm' — ĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩŅĐēиĐĩ, 'n' — ĐŧĐžŅ€ŅĐēиĐĩ, 'a' — авиаŅ†Đ¸ĐžĐŊĐŊŅ‹Đĩ) - + Display labels on track and routepoints (default = 1) ПоĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋОдĐŋиŅĐ¸ в Ņ‚ĐžŅ‡ĐēĐ°Ņ… Ņ‚Ņ€ĐĩĐēĐ° и ĐŋŅƒŅ‚и (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ = 1) - + Retain at most this number of position points (0 = unlimited) ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ ĐŊĐĩ йОĐģĐĩĐĩ ŅŅ‚ĐžĐŗĐž ĐēĐžĐģиŅ‡ĐĩŅŅ‚ва Ņ‚ĐžŅ‡ĐĩĐē ĐŋĐžĐģĐžĐļĐĩĐŊиŅ (0 = ĐąĐĩС ĐžĐŗŅ€Đ°ĐŊиŅ‡ĐĩĐŊиК) - + Rotate colors for tracks and routes (default automatic) ВаŅ€ŅŒĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ†Đ˛ĐĩŅ‚Đ° Đ´ĐģŅ Ņ‚Ņ€ĐĩĐēОв и ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ов (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: авŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐĩŅĐēи) - + Precision of coordinates, number of decimals ĐĸĐžŅ‡ĐŊĐžŅŅ‚ŅŒ ĐēООŅ€Đ´Đ¸ĐŊĐ°Ņ‚, ĐēĐžĐģиŅ‡ĐĩŅŅ‚вО Ņ†Đ¸Ņ„Ņ€ ĐŋĐžŅĐģĐĩ СаĐŋŅŅ‚ОК - + Google Earth (Keyhole) Markup Language Đ¯ĐˇŅ‹Đē Ņ€Đ°ĐˇĐŧĐĩŅ‚Đēи Google Earth (Keyhole) - Google Navigator Tracklines (.trl) - ЛиĐŊии Ņ‚Ņ€ĐĩĐēОв Google Navigator (.trl) + ЛиĐŊии Ņ‚Ņ€ĐĩĐēОв Google Navigator (.trl) - + Complete date-free tracks with given date (YYYYMMDD). ДобавĐģŅŅ‚ŅŒ в Ņ‚Ņ€ĐĩĐēи ĐąĐĩС Đ´Đ°Ņ‚Ņ‹ ŅƒĐēаСаĐŊĐŊŅƒŅŽ Đ´Đ°Ņ‚Ņƒ (ГГГГММДД). - + GPS Tracking Key Pro text ĐĸĐĩĐēŅŅ‚ GPS Tracking Key Pro - + + Google Takeout Location History + ЖŅƒŅ€ĐŊĐ°Đģ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиК Google Takeout + + + GPS TrackMaker GPS TrackMaker - + GPSBabel arc filter file ФаКĐģ Đ´ŅƒĐŗОвОĐŗĐž Ņ„иĐģŅŒŅ‚Ņ€Đ° GPSBabel - + GpsDrive Format ФОŅ€ĐŧĐ°Ņ‚ GpsDrive - + GpsDrive Format for Tracks ФОŅ€ĐŧĐ°Ņ‚ GpsDrive Đ´ĐģŅ Ņ‚Ņ€ĐĩĐēОв - + No whitespace in generated shortnames ЗаĐŋŅ€ĐĩŅ‚иŅ‚ŅŒ ĐŋŅ€ĐžĐąĐĩĐģŅ‹ в ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩĐŧŅ‹Ņ… ĐēĐžŅ€ĐžŅ‚ĐēиŅ… ĐŊаСваĐŊиŅŅ… - + Create waypoints from geocache log entries ХОСдаваŅ‚ŅŒ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ĐŊĐ° ĐžŅĐŊОвĐĩ СаĐŋиŅĐĩĐš ĐļŅƒŅ€ĐŊĐ°ĐģĐ° ĐŗĐĩĐžĐēŅŅˆĐ° - + Base URL for link tag in output БазовŅ‹Đš URL-Đ°Đ´Ņ€ĐĩŅ Đ´ĐģŅ Ņ‚ĐĩĐŗĐ° ŅŅŅ‹ĐģĐēи в вŅ‹Đ˛ĐžĐ´Đĩ - + Target GPX version for output ĐĻĐĩĐģĐĩваŅ вĐĩŅ€ŅĐ¸Ņ GPX Đ´ĐģŅ вŅ‹Đ˛ĐžĐ´Đ° - + Add info (depth) as Humminbird extension ДобавĐģŅŅ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ (ĐŗĐģŅƒĐąĐ¸ĐŊŅƒ) ĐēĐ°Đē Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ Humminbird - + Add info (depth) as Garmin extension ДобавĐģŅŅ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ (ĐŗĐģŅƒĐąĐ¸ĐŊŅƒ) ĐēĐ°Đē Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊиĐĩ Garmin - + Precision of elevations, number of decimals ĐĸĐžŅ‡ĐŊĐžŅŅ‚ŅŒ вŅ‹ŅĐžŅ‚, ĐēĐžĐģиŅ‡ĐĩŅŅ‚вО Ņ†Đ¸Ņ„Ņ€ ĐŋĐžŅĐģĐĩ СаĐŋŅŅ‚ОК - + GPX XML GPX XML - HikeTech - HikeTech + HikeTech - Holux (gm-100) .wpo Format - ФОŅ€ĐŧĐ°Ņ‚ Holux (gm-100) .wpo + ФОŅ€ĐŧĐ°Ņ‚ Holux (gm-100) .wpo - - - - + + + + MTK compatible CSV output file ВŅ‹Ņ…ОдĐŊОК Ņ„Đ°ĐšĐģ CSV, ŅĐžĐ˛ĐŧĐĩŅŅ‚иĐŧŅ‹Đš Ņ MTK - + Holux M-241 (MTK based) Binary File Format ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв Holux M-241 (ĐŊĐ° ĐžŅĐŊОвĐĩ MTK) - - - + + Enable logging after download ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ вĐĩĐ´ĐĩĐŊиĐĩ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° ĐŋĐžŅĐģĐĩ СаĐŗŅ€ŅƒĐˇĐēи - - + + Size of blocks in KB to request from device РаСĐŧĐĩŅ€ ĐąĐģĐžĐēОв в КБ Đ´ĐģŅ СаĐŋŅ€ĐžŅĐ° Ņƒ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва - + Holux M-241 (MTK based) download ЗаĐŗŅ€ŅƒĐˇĐēĐ° Holux M-241 (ĐŊĐ° ĐžŅĐŊОвĐĩ MTK) - + Path to HTML style sheet ПŅƒŅ‚ŅŒ Đē Ņ‚Đ°ĐąĐģиŅ†Đĩ ŅŅ‚иĐģĐĩĐš HTML - - - + + + Encrypt hints using ROT13 ЗаŅˆĐ¸Ņ„Ņ€ĐžĐ˛Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŋОдŅĐēаСĐēи Ņ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ROT13 - - + + Include groundspeak logs if present ВĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ ĐļŅƒŅ€ĐŊĐ°ĐģŅ‹ Groundspeak (ĐĩŅĐģи Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹) - - + + Degrees output as 'ddd', 'dmm'(default) or 'dms' ВŅ‹Đ˛ĐžĐ´ ĐŗŅ€Đ°Đ´ŅƒŅĐžĐ˛ ĐēĐ°Đē "ddd" (Đ´ĐĩŅŅŅ‚иŅ‡ĐŊŅ‹Đĩ ĐŗŅ€Đ°Đ´ŅƒŅŅ‹), "dmm" (Đ´ĐĩŅŅŅ‚иŅ‡ĐŊŅ‹Đĩ ĐŧиĐŊŅƒŅ‚Ņ‹, ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ) иĐģи "dms" (Đ´ĐĩŅŅŅ‚иŅ‡ĐŊŅ‹Đĩ ŅĐĩĐēŅƒĐŊĐ´Ņ‹) - - + + Units for altitude (f)eet or (m)etres ЕдиĐŊиŅ†Ņ‹ вŅ‹ŅĐžŅ‚Ņ‹, "f" (Ņ„ŅƒŅ‚Ņ‹) иĐģи "m" (ĐŧĐĩŅ‚Ņ€Ņ‹) - + HTML Output ВŅ‹Đ˛ĐžĐ´ HTML - + Humminbird tracks (.ht) ĐĸŅ€ĐĩĐēи Humminbird (.ht) - + Humminbird waypoints and routes (.hwr) МаŅ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи и ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ņ‹ Humminbird (.hwr) - Index of track to write (if more than one in source) - ИĐŊĐ´ĐĩĐēŅ Ņ‚Ņ€ĐĩĐēĐ° Đ´ĐģŅ СаĐŋиŅĐ¸ (ĐĩŅĐģи в иŅŅ‚ĐžŅ‡ĐŊиĐēĐĩ йОĐģŅŒŅˆĐĩ ОдĐŊĐžĐŗĐž) + ИĐŊĐ´ĐĩĐēŅ Ņ‚Ņ€ĐĩĐēĐ° Đ´ĐģŅ СаĐŋиŅĐ¸ (ĐĩŅĐģи в иŅŅ‚ĐžŅ‡ĐŊиĐēĐĩ йОĐģŅŒŅˆĐĩ ОдĐŊĐžĐŗĐž) - IGN Rando track files - ФаКĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв IGN Rando + ФаКĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв IGN Rando - iGo Primo points of interest (.upoi) - ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и iGo Primo (.upoi) + ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и iGo Primo (.upoi) - iGO2008 points of interest (.upoi) - ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и iGO2008 (.upoi) + ДоŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и iGO2008 (.upoi) - Track identification number - ИдĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đš ĐŊĐžĐŧĐĩŅ€ Ņ‚Ņ€ĐĩĐēĐ° + ИдĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đš ĐŊĐžĐŧĐĩŅ€ Ņ‚Ņ€ĐĩĐēĐ° - Track title - НазваĐŊиĐĩ Ņ‚Ņ€ĐĩĐēĐ° + НазваĐŊиĐĩ Ņ‚Ņ€ĐĩĐēĐ° - Track description - ОĐŋиŅĐ°ĐŊиĐĩ Ņ‚Ņ€ĐĩĐēĐ° + ОĐŋиŅĐ°ĐŊиĐĩ Ņ‚Ņ€ĐĩĐēĐ° - IGO8 .trk - IGO8 .trk + IGO8 .trk - Kompass (DAV) Track (.tk) - ĐĸŅ€ĐĩĐē Kompass (DAV) (.tk) + ĐĸŅ€ĐĩĐē Kompass (DAV) (.tk) - Kompass (DAV) Waypoints (.wp) - МаŅ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи Kompass (DAV) (.wp) + МаŅ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи Kompass (DAV) (.wp) - + (USR input) Ignore event marker icons on read (ввОд USR) ИĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ СĐŊĐ°Ņ‡Đēи ĐŧĐ°Ņ€ĐēĐĩŅ€ĐžĐ˛ ŅĐžĐąŅ‹Ņ‚иК ĐŋŅ€Đ¸ Ņ‡Ņ‚ĐĩĐŊии - + (USR output) Treat waypoints as icons on write (вŅ‹Đ˛ĐžĐ´ USR) Đ Đ°ŅŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚ŅŒ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи ĐēĐ°Đē СĐŊĐ°Ņ‡Đēи ĐŋŅ€Đ¸ СаĐŋиŅĐ¸ - + (USR output) Merge into one segmented trail (вŅ‹Đ˛ĐžĐ´ USR) ОбŅŠĐĩдиĐŊŅŅ‚ŅŒ в ОдиĐŊ ŅĐĩĐŗĐŧĐĩĐŊŅ‚иŅ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš ŅĐģĐĩĐ´ - + (USR input) Break segments into separate trails (ввОд USR) РаСйиваŅ‚ŅŒ ŅĐĩĐŗĐŧĐĩĐŊŅ‚Ņ‹ ĐŊĐ° ĐžŅ‚Đ´ĐĩĐģŅŒĐŊŅ‹Đĩ ŅĐģĐĩĐ´Ņ‹ - + (USR output) Write version (USR input) Read version (вŅ‹Đ˛ĐžĐ´ USR) ВĐĩŅ€ŅĐ¸Ņ Đ´ĐģŅ СаĐŋиŅĐ¸ - + (USR output) Output file title string (вŅ‹Đ˛ĐžĐ´ USR) ĐĄŅ‚Ņ€ĐžĐēĐ° ĐŊаСваĐŊиŅ вŅ‹Ņ…ОдĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģĐ° - + (USR output) Device serial number (вŅ‹Đ˛ĐžĐ´ USR) ĐĄĐĩŅ€Đ¸ĐšĐŊŅ‹Đš ĐŊĐžĐŧĐĩŅ€ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва - + (USR output) Output file content description (вŅ‹Đ˛ĐžĐ´ USR) ОĐŋиŅĐ°ĐŊиĐĩ ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐŗĐž вŅ‹Ņ…ОдĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģĐ° - + Lowrance USR Lowrance USR - - - Max number of comments to write (maxcmts=200) - МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐžĐĩ ĐēĐžĐģиŅ‡ĐĩŅŅ‚вО ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đĩв Đ´ĐģŅ СаĐŋиŅĐ¸ (maxcmts=200) + МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐžĐĩ ĐēĐžĐģиŅ‡ĐĩŅŅ‚вО ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đĩв Đ´ĐģŅ СаĐŋиŅĐ¸ (maxcmts=200) - Magellan SD files (as for eXplorist) - ФаКĐģŅ‹ Magellan SD (Đ´ĐģŅ eXplorist) + ФаКĐģŅ‹ Magellan SD (Đ´ĐģŅ eXplorist) - Magellan SD files (as for Meridian) - ФаКĐģŅ‹ Magellan SD (Đ´ĐģŅ Meridian) + ФаКĐģŅ‹ Magellan SD (Đ´ĐģŅ Meridian) - Numeric value of bitrate (baud=4800) - ЧиŅĐģОвОĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ŅĐēĐžŅ€ĐžŅŅ‚и ĐŋĐžŅ‚ĐžĐēĐ° (baud=4800) + ЧиŅĐģОвОĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ŅĐēĐžŅ€ĐžŅŅ‚и ĐŋĐžŅ‚ĐžĐēĐ° (baud=4800) - Suppress use of handshaking in name of speed - ПодавĐģŅŅ‚ŅŒ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ Ņ€ŅƒĐēĐžĐŋĐžĐļĐ°Ņ‚иК Đ´ĐģŅ ŅƒĐ˛ĐĩĐģиŅ‡ĐĩĐŊиŅ ŅĐēĐžŅ€ĐžŅŅ‚и + ПодавĐģŅŅ‚ŅŒ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ Ņ€ŅƒĐēĐžĐŋĐžĐļĐ°Ņ‚иК Đ´ĐģŅ ŅƒĐ˛ĐĩĐģиŅ‡ĐĩĐŊиŅ ŅĐēĐžŅ€ĐžŅŅ‚и - - Delete all waypoints - ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи + ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи - Magellan serial protocol - ПоŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊŅ‹Đš ĐŋŅ€ĐžŅ‚ĐžĐēĐžĐģ Magellan + ПоŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊŅ‹Đš ĐŋŅ€ĐžŅ‚ĐžĐēĐžĐģ Magellan - MagicMaps IK3D project file (.ikt) - ФаКĐģ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° MagicMaps IK3D (.ikt) + ФаКĐģ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° MagicMaps IK3D (.ikt) - Mainnav - Mainnav + Mainnav - Include only via stations in route - ПŅ€Đ¸ĐŊиĐŧĐ°Ņ‚ŅŒ Ņ‚ĐžĐģŅŒĐēĐž Ņ‚ĐžŅ‡Đēи ĐžŅ‚ ŅŅ‚Đ°ĐŊŅ†Đ¸Đš Đ´ĐģŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° + ПŅ€Đ¸ĐŊиĐŧĐ°Ņ‚ŅŒ Ņ‚ĐžĐģŅŒĐēĐž Ņ‚ĐžŅ‡Đēи ĐžŅ‚ ŅŅ‚Đ°ĐŊŅ†Đ¸Đš Đ´ĐģŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° - Map&Guide 'TourExchangeFormat' XML - Map&Guide 'TourExchangeFormat' XML + Map&Guide 'TourExchangeFormat' XML - MapAsia track file (.tr7) - ФаКĐģ Ņ‚Ņ€ĐĩĐēĐ° MapAsia (.tr7) + ФаКĐģ Ņ‚Ņ€ĐĩĐēĐ° MapAsia (.tr7) - Mapbar (China) navigation track for Sonim Xp3300 - НавиĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đš Ņ‚Ņ€ĐĩĐē Mapbar (КиŅ‚Đ°Đš) Đ´ĐģŅ Sonim Xp3300 + НавиĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊŅ‹Đš Ņ‚Ņ€ĐĩĐē Mapbar (КиŅ‚Đ°Đš) Đ´ĐģŅ Sonim Xp3300 - Mapfactor Navigator - Mapfactor Navigator + Mapfactor Navigator - Mapopolis.com Mapconverter CSV - Mapopolis.com Mapconverter CSV + Mapopolis.com Mapconverter CSV - MapTech Exchange Format - MapTech Exchange Format + MapTech Exchange Format - Speed in bits per second of serial port (autodetect=0) - ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžĐŗĐž ĐŋĐžŅ€Ņ‚Đ° в йиŅ‚Đ°Ņ… в ŅĐĩĐēŅƒĐŊĐ´Ņƒ (авŅ‚ООĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ=0) + ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžĐŗĐž ĐŋĐžŅ€Ņ‚Đ° в йиŅ‚Đ°Ņ… в ŅĐĩĐēŅƒĐŊĐ´Ņƒ (авŅ‚ООĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ=0) - Download logged fixes - ЗаĐŗŅ€ŅƒĐļĐ°Ņ‚ŅŒ СаĐŊĐĩŅŅ‘ĐŊĐŊŅ‹Đĩ в ĐļŅƒŅ€ĐŊĐ°Đģ иŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ + ЗаĐŗŅ€ŅƒĐļĐ°Ņ‚ŅŒ СаĐŊĐĩŅŅ‘ĐŊĐŊŅ‹Đĩ в ĐļŅƒŅ€ĐŊĐ°Đģ иŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ - Show device status - ПоĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва + ПоĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва - MediaTek Locus - MediaTek Locus + MediaTek Locus - Write items 'locked' [default no] - ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ОйŅŠĐĩĐēŅ‚Ņ‹ "СайĐģĐžĐēиŅ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи" [ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: ĐŊĐĩŅ‚] + ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ОйŅŠĐĩĐēŅ‚Ņ‹ "СайĐģĐžĐēиŅ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đŧи" [ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: ĐŊĐĩŅ‚] - Write items 'visible' [default yes] - ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ОйŅŠĐĩĐēŅ‚Ņ‹ "видиĐŧŅ‹Đŧи" [ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: Đ´Đ°] + ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ОйŅŠĐĩĐēŅ‚Ņ‹ "видиĐŧŅ‹Đŧи" [ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: Đ´Đ°] - Write files with internal version [n] - ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ Ņ вĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊĐĩĐš вĐĩŅ€ŅĐ¸ĐĩĐš [n] + ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹ Ņ вĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊĐĩĐš вĐĩŅ€ŅĐ¸ĐĩĐš [n] - Memory-Map Navigator overlay files (.mmo) - ФаКĐģŅ‹ ĐŊĐ°ĐģĐžĐļĐĩĐŊиŅ Memory-Map Navigator (.mmo) + ФаКĐģŅ‹ ĐŊĐ°ĐģĐžĐļĐĩĐŊиŅ Memory-Map Navigator (.mmo) - Microsoft Streets and Trips 2002-2007 - Microsoft Streets and Trips 2002-2007 + Microsoft Streets and Trips 2002-2007 - - + + Baud rate used for download ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ СаĐŗŅ€ŅƒĐˇĐēи в йОдаŅ… - - + + First sector to be read from the device ПĐĩŅ€Đ˛Ņ‹Đš ŅĐĩĐēŅ‚ĐžŅ€ Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ Ņ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва - - + + Baud rate used to init device (0=autodetect) ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ иĐŊиŅ†Đ¸Đ°ĐģиСаŅ†Đ¸Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва в йОдаŅ… (0=авŅ‚ООĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ) - - + + Last sector to be read from the device (-1: smart read everything) ПоŅĐģĐĩĐ´ĐŊиК ŅĐĩĐēŅ‚ĐžŅ€ Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ Ņ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚ва (-1: иĐŊŅ‚ĐĩĐģĐģĐĩĐēŅ‚ŅƒĐ°ĐģŅŒĐŊĐžĐĩ Ņ‡Ņ‚ĐĩĐŊиĐĩ вŅĐĩĐŗĐž) - - + + Disable output (useful with erase) ОŅ‚ĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ вŅ‹Đ˛ĐžĐ´ (ĐŋĐžĐģĐĩСĐŊĐž ĐŋŅ€Đ¸ ŅƒĐ´Đ°ĐģĐĩĐŊии) - - + + Number of sectors to read at once (0=use single sector mode) КоĐģиŅ‡ĐĩŅŅ‚вО ŅĐĩĐēŅ‚ĐžŅ€ĐžĐ˛ Đ´ĐģŅ ОдĐŊОвŅ€ĐĩĐŧĐĩĐŊĐŊĐžĐŗĐž Ņ‡Ņ‚ĐĩĐŊиŅ (0=иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ОдĐŊĐžŅĐĩĐēŅ‚ĐžŅ€ĐŊŅ‹Đš Ņ€ĐĩĐļиĐŧ) - + POI for Home Symbol as lat:lng[:alt] ĐŖĐēаСаŅ‚ŅŒ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐēĐ° Đ´ĐžĐŧĐ° ĐēĐ°Đē lat:lng[:alt] - + POI for Car Symbol as lat:lng[:alt] ĐŖĐēаСаŅ‚ŅŒ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐēĐ° авŅ‚ĐžĐŧОйиĐģŅ ĐēĐ°Đē lat:lng[:alt] - + POI for Boat Symbol as lat:lng[:alt] ĐŖĐēаСаŅ‚ŅŒ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐēĐ° ĐēĐžŅ€Đ°ĐąĐģŅ ĐēĐ°Đē lat:lng[:alt] - + POI for Heart Symbol as lat:lng[:alt] ĐŖĐēаСаŅ‚ŅŒ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐēĐ° ŅĐĩŅ€Đ´Ņ†Đ° ĐēĐ°Đē lat:lng[:alt] - + POI for Bar Symbol as lat:lng[:alt] ĐŖĐēаСаŅ‚ŅŒ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ СĐŊĐ°Ņ‡ĐēĐ° Ņ€ĐĩŅŅ‚ĐžŅ€Đ°ĐŊĐ° ĐēĐ°Đē lat:lng[:alt] - + MiniHomer, a skyTraq Venus 6 based logger (download tracks, waypoints and get/set POI) MiniHomer, ŅŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… ĐŊĐ° ĐžŅĐŊОвĐĩ skyTraq Venus 6 (СаĐŗŅ€ŅƒĐˇĐēĐ° Ņ‚Ņ€ĐĩĐēОв, ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē, Đ° Ņ‚Đ°ĐēĐļĐĩ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиĐĩ/ŅƒŅŅ‚Đ°ĐŊОвĐēĐ° Ņ‚ĐžŅ‡ĐĩĐē иĐŊŅ‚ĐĩŅ€ĐĩŅĐ°) - + Garmin Mobile XT ([ATRK]/STRK) Garmin Mobile XT ([ATRK]/STRK) - + Track name processing option ([0]-nrm/1-ign) ПаŅ€Đ°ĐŧĐĩŅ‚Ņ€ ОйŅ€Đ°ĐąĐžŅ‚Đēи ĐŊаСваĐŊиК Ņ‚Ņ€ĐĩĐēОв ([0]-nrm/1-ign) - + Mobile Garmin XT Track files ФаКĐģŅ‹ Ņ‚Ņ€ĐĩĐēОв Mobile Garmin XT - Motoactiv CSV - Motoactiv CSV + Motoactiv CSV - Index of route to write (if more than one in source) - ИĐŊĐ´ĐĩĐēŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° Đ´ĐģŅ СаĐŋиŅĐ¸ (ĐĩŅĐģи в иŅŅ‚ĐžŅ‡ĐŊиĐēĐĩ йОĐģŅŒŅˆĐĩ ОдĐŊĐžĐŗĐž) + ИĐŊĐ´ĐĩĐēŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° Đ´ĐģŅ СаĐŋиŅĐ¸ (ĐĩŅĐģи в иŅŅ‚ĐžŅ‡ĐŊиĐēĐĩ йОĐģŅŒŅˆĐĩ ОдĐŊĐžĐŗĐž) - New name for the route - НовоĐĩ иĐŧŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° + НовоĐĩ иĐŧŅ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ° - Radius of our big earth (default 6371000 meters) - РадиŅƒŅ ЗĐĩĐŧĐģи (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: 6371000 ĐŧĐĩŅ‚Ņ€ĐžĐ˛) + РадиŅƒŅ ЗĐĩĐŧĐģи (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: 6371000 ĐŧĐĩŅ‚Ņ€ĐžĐ˛) - Motorrad Routenplaner (Map&Guide) .bcr files - ФаКĐģŅ‹ Motorrad Routenplaner (Map&Guide) .bcr + ФаКĐģŅ‹ Motorrad Routenplaner (Map&Guide) .bcr - + MTK Logger (iBlue 747,...) Binary File Format ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв MTK Logger (iBlue 747,...) - + MTK Logger (iBlue 747,Qstarz BT-1000,...) download ЗаĐŗŅ€ŅƒĐˇĐēĐ° MTK Logger (iBlue 747,Qstarz BT-1000,...) - MyNav TRC format - ФОŅ€ĐŧĐ°Ņ‚ MyNav TRC + ФОŅ€ĐŧĐ°Ņ‚ MyNav TRC - + Datum (default=NAD27) ХиŅŅ‚ĐĩĐŧĐ° ĐēООŅ€Đ´Đ¸ĐŊĐ°Ņ‚ (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ=NAD27) - + National Geographic Topo .tpg (waypoints) National Geographic Topo .tpg (ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи) - + National Geographic Topo 2.x .tpo National Geographic Topo 2.x .tpo - + National Geographic Topo 3.x/4.x .tpo National Geographic Topo 3.x/4.x .tpo - Navigon Waypoints - МаŅ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи Navigon + МаŅ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи Navigon - Delete all track points - ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēОв + ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēОв - Delete all routes - ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ņ‹ + ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ņ‹ - Clear the datalog - ОŅ‡Đ¸Ņ‰Đ°Ņ‚ŅŒ ĐļŅƒŅ€ĐŊĐ°Đģ Đ´Đ°ĐŊĐŊŅ‹Ņ… + ОŅ‡Đ¸Ņ‰Đ°Ņ‚ŅŒ ĐļŅƒŅ€ĐŊĐ°Đģ Đ´Đ°ĐŊĐŊŅ‹Ņ… - Read from datalogger buffer - ЧиŅ‚Đ°Ņ‚ŅŒ иС ĐąŅƒŅ„ĐĩŅ€Đ° ŅŅ€ĐĩĐ´ŅŅ‚ва СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… + ЧиŅ‚Đ°Ņ‚ŅŒ иС ĐąŅƒŅ„ĐĩŅ€Đ° ŅŅ€ĐĩĐ´ŅŅ‚ва СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… - NaviGPS GT-11/BGT-11 Download - ЗаĐŗŅ€ŅƒĐˇĐēĐ° NaviGPS GT-11/BGT-11 + ЗаĐŗŅ€ŅƒĐˇĐēĐ° NaviGPS GT-11/BGT-11 - NaviGPS GT-31/BGT-31 datalogger (.sbp) - ĐĄŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… NaviGPS GT-31/BGT-31 (.sbp) + ĐĄŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… NaviGPS GT-31/BGT-31 (.sbp) - NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) - ДвоиŅ‡ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° NaviGPS GT-31/BGT-31 SiRF (.sbn) + ДвоиŅ‡ĐŊŅ‹Đš Ņ„Đ°ĐšĐģ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° NaviGPS GT-31/BGT-31 SiRF (.sbn) - Navitel binary track (.bin) - ДвоиŅ‡ĐŊŅ‹Đš Ņ‚Ņ€ĐĩĐē Navitel (.bin) + ДвоиŅ‡ĐŊŅ‹Đš Ņ‚Ņ€ĐĩĐē Navitel (.bin) - Navitrak DNA marker format - ФОŅ€ĐŧĐ°Ņ‚ ĐŧĐ°Ņ€ĐēĐĩŅ€ĐžĐ˛ ДНК Navitrak + ФОŅ€ĐŧĐ°Ņ‚ ĐŧĐ°Ņ€ĐēĐĩŅ€ĐžĐ˛ ДНК Navitrak - NIMA/GNIS Geographic Names File - ФаКĐģ ĐŗĐĩĐžĐŗŅ€Đ°Ņ„иŅ‡ĐĩŅĐēиŅ… ĐŊаСваĐŊиК NIMA/GNIS + ФаКĐģ ĐŗĐĩĐžĐŗŅ€Đ°Ņ„иŅ‡ĐĩŅĐēиŅ… ĐŊаСваĐŊиК NIMA/GNIS - + Max length of waypoint name to write МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐ°Ņ Đ´ĐģиĐŊĐ° иĐŧĐĩĐŊи ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊОК Ņ‚ĐžŅ‡Đēи Đ´ĐģŅ СаĐŋиŅĐ¸ - + Read/write GPRMC sentences ЧиŅ‚Đ°Ņ‚ŅŒ/СаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и GPRMC - + Read/write GPGGA sentences ЧиŅ‚Đ°Ņ‚ŅŒ/СаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и GPGGA - + Read/write GPVTG sentences ЧиŅ‚Đ°Ņ‚ŅŒ/СаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и GPVTG - + Read/write GPGSA sentences ЧиŅ‚Đ°Ņ‚ŅŒ/СаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и GPGSA - + Decimal seconds to pause between groups of strings ПаŅƒĐˇĐ° (в ŅĐĩĐēŅƒĐŊĐ´Đ°Ņ…) ĐŧĐĩĐļĐ´Ņƒ ĐŗŅ€ŅƒĐŋĐŋĐ°Đŧи ŅŅ‚Ņ€ĐžĐē - + Append realtime positioning data to the output file instead of truncating ДобавĐģŅŅ‚ŅŒ Đ´Đ°ĐŊĐŊŅ‹Đĩ Đž Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊии в Ņ€ĐĩĐ°ĐģŅŒĐŊĐžĐŧ вŅ€ĐĩĐŧĐĩĐŊи в ĐēĐžĐŊŅ†Đĩ вŅ‹Ņ…ОдĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģĐ°, Đ° ĐŊĐĩ ŅƒŅĐĩĐēĐ°Ņ‚ŅŒ иŅ… - + Speed in bits per second of serial port (baud=4800) ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžĐŗĐž ĐŋĐžŅ€Ņ‚Đ° в йиŅ‚Đ°Ņ… в ŅĐĩĐēŅƒĐŊĐ´Ņƒ (baud=4800) - + Write tracks for Gisteq Phototracker ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ‚Ņ€ĐĩĐēи Đ´ĐģŅ Gisteq Phototracker - + Accept position fixes in gpgga marked invalid ПŅ€Đ¸ĐŊиĐŧĐ°Ņ‚ŅŒ иŅĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиŅ в gpgga, ĐžŅ‚ĐŧĐĩŅ‡ĐĩĐŊĐŊŅ‹Đĩ ĐēĐ°Đē ĐŊĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đĩ - + NMEA 0183 sentences ПоŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊĐžŅŅ‚и NMEA 0183 - Compact binary representation - КоĐŧĐŋĐ°ĐēŅ‚ĐŊĐžĐĩ двОиŅ‡ĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚авĐģĐĩĐŊиĐĩ + КоĐŧĐŋĐ°ĐēŅ‚ĐŊĐžĐĩ двОиŅ‡ĐŊĐžĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚авĐģĐĩĐŊиĐĩ - Nokia Landmark Exchange - Nokia Landmark Exchange + Nokia Landmark Exchange - + Write additional way tag key/value pairs ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊиŅ‚ĐĩĐģŅŒĐŊŅ‹Đĩ ĐŋĐ°Ņ€Ņ‹ ĐēĐģŅŽŅ‡/СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐŧĐĩŅ‚ĐžĐē ĐŋŅƒŅ‚и - + Write additional node tag key/value pairs ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊиŅ‚ĐĩĐģŅŒĐŊŅ‹Đĩ ĐŋĐ°Ņ€Ņ‹ ĐēĐģŅŽŅ‡/СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐŧĐĩŅ‚ĐžĐē ŅƒĐˇĐģОв - + Use this value as custom created_by value ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐēĐ°Đē ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅŒŅĐēĐžĐĩ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ created_by - + OpenStreetMap data files ФаКĐģŅ‹ Đ´Đ°ĐŊĐŊŅ‹Ņ… OpenStreetMap - + Write all tracks into one file ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ вŅĐĩ Ņ‚Ņ€ĐĩĐēи в ОдиĐŊ Ņ„Đ°ĐšĐģ - + Waypoint foreground color ĐĻвĐĩŅ‚ ĐŋĐĩŅ€ĐĩĐ´ĐŊĐĩĐŗĐž ĐŋĐģĐ°ĐŊĐ° ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē - + Waypoint background color ĐĻвĐĩŅ‚ Ņ„ĐžĐŊĐ° ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē - + Proximity distance Đ Đ°ŅŅŅ‚ĐžŅĐŊиĐĩ ĐąĐģиСОŅŅ‚и - + Unit used in altitude values ЕдиĐŊиŅ†Đ° Đ´ĐģŅ СĐŊĐ°Ņ‡ĐĩĐŊиК вŅ‹ŅĐžŅ‚ - + Unit used in proximity values ЕдиĐŊиŅ†Đ° Đ´ĐģŅ СĐŊĐ°Ņ‡ĐĩĐŊиК ĐąĐģиСОŅŅ‚и - + codec to use for reading and writing strings (default windows-1252) ĐēОдĐĩĐē Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ и СаĐŋиŅĐ¸ ŅŅ‚Ņ€ĐžĐē (ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: windows-1252) - + OziExplorer OziExplorer - + Qstarz BL-1000 Qstarz BL-1000 - Default location - ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐĩ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ + ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžĐĩ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ - Raymarine Waypoint File (.rwf) - ФаКĐģ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē Raymarine (.rwf) + ФаКĐģ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē Raymarine (.rwf) - Ricoh GPS Log File - ФаКĐģ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° Ricoh GPS + ФаКĐģ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° Ricoh GPS - See You flight analysis data - ДаĐŊĐŊŅ‹Đĩ Đ°ĐŊĐ°ĐģиСа ĐŋĐžĐģŅ‘Ņ‚Đ° See You + ДаĐŊĐŊŅ‹Đĩ Đ°ĐŊĐ°ĐģиСа ĐŋĐžĐģŅ‘Ņ‚Đ° See You - + Set location finder target location as lat,lng ЗадаŅ‚ŅŒ Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Ņ†ĐĩĐģи ŅŅ€ĐĩĐ´ŅŅ‚ва ĐŋОиŅĐēĐ° Ņ€Đ°ŅĐŋĐžĐģĐžĐļĐĩĐŊиК ĐēĐ°Đē lat,lng - + Configure logging parameter as tmin:tmax:dmin:dmax НаŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ вĐĩĐ´ĐĩĐŊиŅ ĐļŅƒŅ€ĐŊĐ°ĐģĐ° ĐēĐ°Đē tmin:tmax:dmin:dmax - + Video position for which exact GPS time is known (hhmmss[.sss], default is 00:00:00,000) ПозиŅ†Đ¸Ņ в видĐĩĐž, Đ´ĐģŅ ĐēĐžŅ‚ĐžŅ€ĐžĐš иСвĐĩŅŅ‚ĐŊĐž Ņ‚ĐžŅ‡ĐŊĐžĐĩ вŅ€ĐĩĐŧŅ GPS (Ņ‡Ņ‡ĐŧĐŧŅŅ[.ŅŅŅ], ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: 00:00:00,000) - + GPS time at position video_time (hhmmss[.sss], default is first timestamp of track) ВŅ€ĐĩĐŧŅ GPS в ĐŋОСиŅ†Đ¸Đ¸ video_time (Ņ‡Ņ‡ĐŧĐŧŅŅ[.ŅŅŅ], ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: ĐŋĐĩŅ€Đ˛Đ°Ņ вŅ€ĐĩĐŧĐĩĐŊĐŊĐ°Ņ ĐŧĐĩŅ‚ĐēĐ° Ņ‚Ņ€ĐĩĐēĐ°) - + GPS date at position video_time (yyyymmdd, default is first timestamp of track) ДаŅ‚Đ° GPS в ĐŋОСиŅ†Đ¸Đ¸ video_time (ĐŗĐŗĐŗĐŗĐŧĐŧĐ´Đ´, ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ: ĐŋĐĩŅ€Đ˛Đ°Ņ вŅ€ĐĩĐŧĐĩĐŊĐŊĐ°Ņ ĐŧĐĩŅ‚ĐēĐ° Ņ‚Ņ€ĐĩĐēĐ°) - - - + + + Seconds that GPS time tracks UTC (0: best guess) КоĐģиŅ‡ĐĩŅŅ‚вО ŅĐĩĐēŅƒĐŊĐ´ ŅĐŧĐĩŅ‰ĐĩĐŊиŅ вŅ€ĐĩĐŧĐĩĐŊи GPS ĐžŅ‚ UTC (0: ĐŊаиĐģŅƒŅ‡ŅˆĐĩĐĩ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩĐŧĐžĐĩ) - - - + + + GPS week rollover period we're in (-1: best guess) АĐēŅ‚ŅƒĐ°ĐģŅŒĐŊŅ‹Đš ĐŋĐĩŅ€Đ¸ĐžĐ´ ŅĐąŅ€ĐžŅĐ° ĐŊĐžĐŧĐĩŅ€Đ° ĐŊĐĩĐ´ĐĩĐģи GPS (-1: ĐŊаиĐģŅƒŅ‡ŅˆĐĩĐĩ ĐŋŅ€ĐĩĐ´ĐŋĐžĐģĐ°ĐŗĐ°ĐĩĐŧĐžĐĩ) - + SkyTraq Venus based loggers (download) ĐĄŅ€ĐĩĐ´ŅŅ‚ва СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… ĐŊĐ° ĐžŅĐŊОвĐĩ SkyTraq Venus (СаĐŗŅ€ŅƒĐˇĐēĐ°) - + First sector to be read from the file ПĐĩŅ€Đ˛Ņ‹Đš ŅĐĩĐēŅ‚ĐžŅ€ Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ иС Ņ„Đ°ĐšĐģĐ° - + Last sector to be read from the file (-1: read till empty sector) ПоŅĐģĐĩĐ´ĐŊиК ŅĐĩĐēŅ‚ĐžŅ€ Đ´ĐģŅ Ņ‡Ņ‚ĐĩĐŊиŅ иС Ņ„Đ°ĐšĐģĐ° (-1: Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ Đ´Đž Đ´ĐžŅŅ‚иĐļĐĩĐŊиŅ ĐŋŅƒŅŅ‚ĐžĐŗĐž ŅĐĩĐēŅ‚ĐžŅ€Đ°) - + SkyTraq Venus based loggers Binary File Format ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв ŅŅ€ĐĩĐ´ŅŅ‚в СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… ĐŊĐ° ĐžŅĐŊОвĐĩ SkyTraq Venus - + Format for subtitles ФОŅ€ĐŧĐ°Ņ‚ Đ´ĐģŅ ŅŅƒĐąŅ‚иŅ‚Ņ€ĐžĐ˛ - + SubRip subtitles for video mapping (.srt) ĐĄŅƒĐąŅ‚иŅ‚Ņ€Ņ‹ SubRip Đ´ĐģŅ видĐĩĐžĐēĐ°Ņ€Ņ‚ĐžĐŗŅ€Đ°Ņ„иŅ€ĐžĐ˛Đ°ĐŊиŅ (.srt) - Swiss Map 25/50/100 (.xol) - Swiss Map 25/50/100 (.xol) + Swiss Map 25/50/100 (.xol) - + Tab delimited fields useful for OpenOffice РаСдĐĩĐģŅ‘ĐŊĐŊŅ‹Đĩ Ņ‚Đ°ĐąŅƒĐģŅŅ†Đ¸ŅĐŧи ĐŋĐžĐģŅ Đ´ĐģŅ OpenOffice - Teletype [ Get Jonathon Johnson to describe - ĐĸĐĩĐģĐĩŅ‚Đ°ĐšĐŋ + ĐĸĐĩĐģĐĩŅ‚Đ°ĐšĐŋ - + Suppress separator lines between waypoints ПодавĐģŅŅ‚ŅŒ Ņ€Đ°ĐˇĐ´ĐĩĐģиŅ‚ĐĩĐģŅŒĐŊŅ‹Đĩ ĐģиĐŊии ĐŧĐĩĐļĐ´Ņƒ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đŧи Ņ‚ĐžŅ‡ĐēĐ°Đŧи - + Write each waypoint in a separate file ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēĐ°ĐļĐ´ŅƒŅŽ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅƒŅŽ Ņ‚ĐžŅ‡ĐēŅƒ в ĐžŅ‚Đ´ĐĩĐģŅŒĐŊŅ‹Đš Ņ„Đ°ĐšĐģ - + Textual Output ĐĸĐĩĐēŅŅ‚ОвŅ‹Đš вŅ‹Đ˛ĐžĐ´ - TomTom Itineraries (.itn) - МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ TomTom (.itn) + МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ TomTom (.itn) - TomTom Places Itineraries (.itn) - МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ TomTom Places (.itn) + МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ TomTom Places (.itn) - TomTom POI file (.asc) - ФаКĐģ Đ´ĐžŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚ĐĩĐš TomTom (.asc) + ФаКĐģ Đ´ĐžŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚ĐĩĐš TomTom (.asc) - TomTom POI file (.ov2) - ФаКĐģ Đ´ĐžŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚ĐĩĐš TomTom (.ov2) + ФаКĐģ Đ´ĐžŅŅ‚ĐžĐŋŅ€Đ¸ĐŧĐĩŅ‡Đ°Ņ‚ĐĩĐģŅŒĐŊĐžŅŅ‚ĐĩĐš TomTom (.ov2) - Index of track (if more than one in source) - ИĐŊĐ´ĐĩĐēŅ Ņ‚Ņ€ĐĩĐēĐ° (ĐĩŅĐģи в иŅŅ‚ĐžŅ‡ĐŊиĐēĐĩ йОĐģŅŒŅˆĐĩ ОдĐŊĐžĐŗĐž) + ИĐŊĐ´ĐĩĐēŅ Ņ‚Ņ€ĐĩĐēĐ° (ĐĩŅĐģи в иŅŅ‚ĐžŅ‡ĐŊиĐēĐĩ йОĐģŅŒŅˆĐĩ ОдĐŊĐžĐŗĐž) - TrackLogs digital mapping (.trl) - ĐĻиŅ„Ņ€ĐžĐ˛Đ°Ņ ĐēĐ°Ņ€Ņ‚ĐžĐŗŅ€Đ°Ņ„иŅ TrackLogs (.trl) + ĐĻиŅ„Ņ€ĐžĐ˛Đ°Ņ ĐēĐ°Ņ€Ņ‚ĐžĐŗŅ€Đ°Ņ„иŅ TrackLogs (.trl) - + Write name(s) of format(s) from input session(s) ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŊаСваĐŊиŅ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ов иС вŅ…ОдĐŊŅ‹Ņ… ŅĐĩĐ°ĐŊŅĐžĐ˛ - + Write filename(s) from input session(s) ЗаĐŋиŅŅ‹Đ˛Đ°Ņ‚ŅŒ иĐŧĐĩĐŊĐ° Ņ„Đ°ĐšĐģОв иС вŅ…ОдĐŊŅ‹Ņ… ŅĐĩĐ°ĐŊŅĐžĐ˛ - + Universal csv with field structure in first line ĐŖĐŊивĐĩŅ€ŅĐ°ĐģŅŒĐŊŅ‹Đš csv ŅĐž ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€ĐžĐš ĐŋĐžĐģĐĩĐš в ĐŋĐĩŅ€Đ˛ĐžĐš ŅŅ‚Ņ€ĐžĐēĐĩ - + Vcard Output (for iPod) ВŅ‹Đ˛ĐžĐ´ Vcard (Đ´ĐģŅ iPod) - Wintec TES file - ФаКĐģ Wintec TES + ФаКĐģ Wintec TES - Wintec WBT-100/200 Binary File Format - ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв Wintec WBT-100/200 + ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв Wintec WBT-100/200 - Wintec WBT-100/200 GPS Download - ЗаĐŗŅ€ŅƒĐˇĐēĐ° Wintec WBT-100/200 GPS + ЗаĐŗŅ€ŅƒĐˇĐēĐ° Wintec WBT-100/200 GPS - Wintec WBT-201/G-Rays 2 Binary File Format - ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв Wintec WBT-201/G-Rays 2 + ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв Wintec WBT-201/G-Rays 2 - - Appends the input to a backup file - ДобавĐģŅĐĩŅ‚ вŅ…ОдĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ в Ņ„Đ°ĐšĐģ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊОК ĐēĐžĐŋии + ДобавĐģŅĐĩŅ‚ вŅ…ОдĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ в Ņ„Đ°ĐšĐģ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊОК ĐēĐžĐŋии - - Only waypoints that are not the backup file - ĐĸĐžĐģŅŒĐēĐž ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ Ņ…Ņ€Đ°ĐŊŅŅ‚ŅŅ в Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŧ Ņ„Đ°ĐšĐģĐĩ + ĐĸĐžĐģŅŒĐēĐž ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ Ņ…Ņ€Đ°ĐŊŅŅ‚ŅŅ в Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐŧ Ņ„Đ°ĐšĐģĐĩ - XAiOX iTrackU Logger - ĐĄŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… XAiOX iTrackU + ĐĄŅ€ĐĩĐ´ŅŅ‚вО СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… XAiOX iTrackU - XAiOX iTrackU Logger Binary File Format - ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв ŅŅ€ĐĩĐ´ŅŅ‚ва СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… XAiOX iTrackU + ФОŅ€ĐŧĐ°Ņ‚ двОиŅ‡ĐŊŅ‹Ņ… Ņ„Đ°ĐšĐģОв ŅŅ€ĐĩĐ´ŅŅ‚ва СаĐŋиŅĐ¸ Đ´Đ°ĐŊĐŊŅ‹Ņ… XAiOX iTrackU diff --git a/gui/formatload.cc b/gui/formatload.cc index 23d24fb39..046e16f12 100644 --- a/gui/formatload.cc +++ b/gui/formatload.cc @@ -34,9 +34,6 @@ #include // for QVariant #include // for QApplication #include // for QMessageBox -#ifdef GENERATE_CORE_STRINGS -#include // for QT_VERSION, QT_VERSION_CHECK -#endif #include "appname.h" // for appName @@ -48,11 +45,7 @@ extern QTextStream* generate_output_stream; static QString xlt(const QString& f) { #ifdef GENERATE_CORE_STRINGS -#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) - *generate_output_stream << "QT_TRANSLATE_NOOP(\"core\",\"" << f << "\")" << endl; -#else *generate_output_stream << "QT_TRANSLATE_NOOP(\"core\",\"" << f << "\")" << Qt::endl; -#endif #endif return QCoreApplication::translate("core", f.toUtf8().constData()); } diff --git a/gui/gmapbase.html b/gui/gmapbase.html index 15a50f8be..71422331a 100644 --- a/gui/gmapbase.html +++ b/gui/gmapbase.html @@ -3,8 +3,14 @@ Google Maps JavaScript - - + diff --git a/gui/gmapdlg.cc b/gui/gmapdlg.cc index d5325d45c..02de27d17 100644 --- a/gui/gmapdlg.cc +++ b/gui/gmapdlg.cc @@ -112,9 +112,9 @@ void GMapDialog::appendTrackInfo(QStandardItem* it, const GpxTrack& trk) } if (startTime.isValid()) { it->appendRow(new StandardItem(tr("Start: %1") - .arg(startTime.toString("yyyy-MMM-dd HH:mm:ss")))); + .arg(startTime.toString(u"yyyy-MMM-dd HH:mm:ss")))); it->appendRow(new StandardItem(tr("Stop: %1") - .arg(stopTime.toString("yyyy-MMM-dd HH:mm:ss")))); + .arg(stopTime.toString(u"yyyy-MMM-dd HH:mm:ss")))); } it->appendRow(new StandardItem(tr("Points: %1").arg(count))); diff --git a/gui/gpsbabelfe_de.qm b/gui/gpsbabelfe_de.qm index 86d1536dd..d9f31d0ea 100644 Binary files a/gui/gpsbabelfe_de.qm and b/gui/gpsbabelfe_de.qm differ diff --git a/gui/gpsbabelfe_de.ts b/gui/gpsbabelfe_de.ts index 238bfee12..b005887a9 100644 --- a/gui/gpsbabelfe_de.ts +++ b/gui/gpsbabelfe_de.ts @@ -16,12 +16,13 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -31,6 +32,28 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -471,17 +494,17 @@ p, li { white-space: pre-wrap; } default - + Select one or more input files eine oder mehrere Originaldateien markieren - + Output File Name Zieldatei-Name - + Error reading format configuration. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. @@ -490,7 +513,7 @@ This program cannot continue. Das Programm muss abgebrochen werden. - + Some file/device formats were not found during initialization. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. @@ -499,7 +522,7 @@ This program cannot continue. Das Prgramm muss abgebrochen werden. - + Input and output formats do not support %1 Keine UnterstÃŧtzung fÃŧr %1 im Ein- oder Ausgabeformat @@ -512,68 +535,68 @@ Das Prgramm muss abgebrochen werden. Eingabeformat unterstÃŧtzt %1. Keine UnterstÃŧtzung fÃŧr %2 im Ausgabeformat - + Input does not support %1; output format supports %1 Keine UnterstÃŧtzung fÃŧr %1 im Eingabeformat; Ausgabeformat unterstÃŧtzt %1 {1;?} - + Input format supports %1; output format does not support %1 Eingabeformat unterstÃŧtzt %1. Keine UnterstÃŧtzung fÃŧr %1 im Ausgabeformat {1;?} - + Both input and output formats support %1 Ein- und Ausgabeformat unterstÃŧtzen %1 - + waypoints Wegpunkte - + tracks tracks - + routes Routen - + There are no input options for format "%1" Es gibt keine Eingabeoptionen fÃŧr das Format "%1" - - + + Options for %1 Optionen fÃŧr %1 - + There are no output options for format "%1" Es gibt keine Ausgabeoptionen fÃŧr das Format "%1" - + No valid waypoints/routes/tracks translation specified keine gÃŧltige Angabe von Wegpunkt-/Routen-/Trackfiltern - + No input file specified keine Quelldatei angegeben - + No valid output specified keine gÃŧltiges Ziel angegeben - + No output file specified keine Zieldatei angegeben @@ -586,33 +609,33 @@ Das Prgramm muss abgebrochen werden. Prozess endete mit code %1 - + Translation successful Konvertierung erfolgreich - + Error running gpsbabel: %1 Fehler beim Aufruf von gpsbabel: %1 - + Are you sure you want to reset all format options to default values? Sind Sie sicher, dass Sie alle Formatoptionen auf die Vorgaben stellen wollen? - + About %1 Über %1 - + One or more data filters are active Einer oder mehrere Datenfilter sind aktiviert - + No data filters are active Keine Datenfilter sind aktiv @@ -865,17 +888,17 @@ Das Prgramm muss abgebrochen werden. Map - + Error opening "gmapbase.html" file. Check installation - + Missing "gmapbase.html" file. Check installation Datei "gmapbase.html" nicht gefunden. PrÃŧfen Sie die Installation - + Failed to load Google maps base page Fehler beim Laden der Google maps Hauptseite @@ -884,28 +907,28 @@ Das Prgramm muss abgebrochen werden. MiscFltWidget - - - - + + + + Tracks Tracks - - - - + + + + Waypoints Wegpunkte - - - - + + + + Routes Routen @@ -1137,7 +1160,7 @@ Manche Dateiformate unterstuetzen nur eine Teilmenge, entweder Wegpunkte oder Tr QObject - + Error processing formats from running process "gpsbabel -^3" at line %1 Fehler beim Verarbeiten der Formate vom laufenden Process "gpsbabel-^3" in Zeile %1 @@ -1352,7 +1375,7 @@ Diese Option korrigiert die Uhrzeit aller Trackpunkte. Dies kann nÃŧtzlich sein, - + days Tage @@ -1364,7 +1387,7 @@ Diese Option korrigiert die Uhrzeit aller Trackpunkte. Dies kann nÃŧtzlich sein, - + mins shortform variant seemed sensible Min. @@ -1396,28 +1419,43 @@ Diese Option wird zusammen mit ihrem Gegenspieler verwendet, um Trackpunkte zu v Start - + + + If checked, times specified here are based on this computer's current time zone. + + + + + + If checked, times specified here are UTC. + + + + + UTC + + + If checked, time specified here is based on this computer's current time zone. - Wenn angekreuzt, richtet sich die angegebene Zeit nach der Zeitzone dieses Computers. + Wenn angekreuzt, richtet sich die angegebene Zeit nach der Zeitzone dieses Computers. - If checked, the times specified here are based on the local computer's time zone. Otherwise it is UTC. - Wenn angekreuzt, richtet sich die angegebene Zeit nach der Zeitzone dieses Computers. Wenn nicht, wird UTC angenommen. + Wenn angekreuzt, richtet sich die angegebene Zeit nach der Zeitzone dieses Computers. Wenn nicht, wird UTC angenommen. - + Local Time Lokale Zeit - - + + Use track pts before this time. Nur Trackpunkte vor diesem Zeitpunkt behalten. - + Use only track points before this timestamp. This option is used in conjunction with the start option to discard all trackpoints outside of a given period of time. This option defines the end of the time period. @@ -1426,18 +1464,18 @@ This option is used in conjunction with the start option to discard all trackpoi Diese Option wird zusammen mit ihrem GegenstÃŧck verwendet, um alle Trackpunkte auβerhalb eines Zeitfensters zu verwerfen. Diese Option definiert das Ende des Fensters. - + Stop Stop - + Pack all tracks into one. no sentence Tracks zu einem Track verketten - + Pack all tracks into one. This option causes all tracks to be appended to one another to form a single track. This option does not work if any two tracks overlap in time; in that case, consider using the merge option. @@ -1450,18 +1488,18 @@ Diese Option sorgt dafÃŧr, daβ alle Tracks hintereinander zu einen gemeinsamen Diese Option eignet sich am besten dafuer, Tracks zu verbinden, die durch eine Fehlfunktion oder eine automatische 'Ãŧber-Nacht-Auftrennung' aufgeteilt wurden. - + Pack guesswork, depends on context Verketten - + Merge multiple tracks for the same way. Tracks auf einem Weg mischen. - + Merge multiple tracks for the same way. This option puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped. @@ -1470,12 +1508,12 @@ This option puts all track points from all tracks into a single track and sorts Diese Option Ãŧbernimmt alle Punkte aus allen Tracks in einen einzigen Track und sortiert sie nach der Zeit. Punkte mit den gleichen Zeitdaten werden entfernt. - + Merge Mischen - + Split by Date Split tracks. nach Datum teilen @@ -1499,43 +1537,43 @@ Mehrere Tracks, die sich ueber Tagesgrenzen verteilen, kÃļnnen so ebenfalls an D Aufspalten - + If nonzero, the track will be split if the time between two points is greater than this parameter. If zero, the track will be split by date. Falls nicht Null, und wenn die Zeitdaten aufeinanderfolgender Trackpunkte grÃļβer sind als der angegebene Wert, wird der Track dort aufgesplittet. Bei Null wird der Track an den Datumsgrenzen aufgeteilt. - + hrs abbr point Std. - + Split by Dist. nach Entf. teilen - + If nonzero, the input track will be split into several tracks if the distance between successive track points is greater than the distance given as a parameter. Falls nicht Null, und wenn die Distanz aufeinanderfolgender Trackpunkte grÃļβer ist als der angegebene Wert, wird der Track dort aufgesplittet. - + ft ft - + m m - + km km - + mi meilen @@ -1557,43 +1595,43 @@ Diese Option erzeugt GPS Fixwerte und setzt diese fÃŧr alle Trackpunkte auf die Die Option wird eingesetzt, um ein Format, das keine Fixdaten enthält in eines zu konvertieren, das sie voraussetzt. - + GPS Fixes GPS Fixdaten - + none keine - + pps PPS - + dgps DGPS - + 3d 3d - + 2d 2d - + Synthesize course. no sentence Kurswerte generieren - + Synthesize course. This option computes (or recomputes) a value for the GPS heading at each trackpoint. This is most useful with trackpoints from formats that don't support heading information or for trackpoints synthesized by the interpolate filter. The heading at each trackpoint is simply the course from the previous trackpoint in the track. The first trackpoint in each track is arbitrarily assigned a heading of 0 degrees. @@ -1602,23 +1640,23 @@ This option computes (or recomputes) a value for the GPS heading at each trackpo Diese Option erzeugt oder errechnet einen Wert fÃŧr den GPS-Kurs an jeden Trackpunkt. Das ist insbesondere dann nÃŧtzlich, wenn ein Format konvertiert werden soll, das keine Kursdaten enthält - oder fÃŧr Trackpunkte die vom Mittelwert-Filter generiert wurden. Der Kurs an einem Trackpunkt ist einfach die Richtung vom vorherigen Trackpunkt zum aktuellen. Dem ersten Trackpunkt in jedem Track wird automatisch ein Wert von null Grad zugewiesen. - + Course Kurs - + Synthesize speed. no sentence Tempodaten generieren - + Split by Time nach Zeit teilen - + Synthesize speed. This option computes a value for the GPS speed at each trackpoint. This is most useful with trackpoints from formats that don't support speed information or for trackpoints synthesized by the interpolate filter. The speed at each trackpoint is the average speed from the previous trackpoint (distance divided by time). The first trackpoint in each track is assigned a speed of "unknown." @@ -1628,7 +1666,7 @@ This option computes a value for the GPS speed at each trackpoint. This is most Diese Option generiert fÃŧr jeden Trackpunkt einen Geschwindigkeitswert. Sie wird eingesetzt, wenn ein Format konvertiert werden soll, das diese Daten nicht enthält - oder bei Trackpunkten, die vom Mittelwert-Filter generiert wurden. Das Tempo an jedem Trackpunkt ist die mittlere Geschwindigkeit vom vorherigen (Weg durch Zeit). Dem ersten Trackpunkt in allen Tracks wird der Wert 'unbekannt' zugewiesen. - + Speed Geschwindikgkeit @@ -1644,44 +1682,44 @@ Diese Option generiert fÃŧr jeden Trackpunkt einen Geschwindigkeitswert. Sie wir UpgradeCheck - - - + + + HTTP HTTP - + Unexpected reply. - + Download failed: %1. Download fehlgeschlagen: %1. - + Download failed: %1: %2. - + Error - + Invalid return data at line %1: %2. - + A new version of GPSBabel is available.<br />Your version is %1 <br />The latest version is %2 Eine neue Version von GPSBabel ist verfÃŧgbar.<br />Die installierte Version ist %1 <br />Die neueste Version ist %2 - + Do you wish to download an upgrade? MÃļchten Sie die Aktualisierung herunter laden? @@ -1690,7 +1728,7 @@ Diese Option generiert fÃŧr jeden Trackpunkt einen Geschwindigkeitswert. Sie wir <center><b>Eine neue GPSBabel-Version ist verf&uumlgbar</b><br>Die Version auf diesem Computer ist %1 <br>Die neueste Version ist %2</center> - + Upgrade Update diff --git a/gui/gpsbabelfe_es.qm b/gui/gpsbabelfe_es.qm index 25587a7ab..4106d7b10 100644 Binary files a/gui/gpsbabelfe_es.qm and b/gui/gpsbabelfe_es.qm differ diff --git a/gui/gpsbabelfe_es.ts b/gui/gpsbabelfe_es.ts index 8102a6d5c..25b2f449d 100644 --- a/gui/gpsbabelfe_es.ts +++ b/gui/gpsbabelfe_es.ts @@ -16,12 +16,13 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -31,6 +32,28 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -548,31 +571,31 @@ Higher number provides more detailed diagnostics. Defecto - + Select one or more input files Seleccionar uno o mÃĄs archivos de entrada - + Output File Name Nombre del fichero de salida - + Error reading format configuration. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. Se ha producido un error cuando se intentaba leer la configuraciÃŗn. Compruebe que el nÃēcleo de "gpsbabel" estÃĄ instalado correctamente y que se halla en la RUTA actual. Este programa no puede continuar. - + Some file/device formats were not found during initialization. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. El formato de alfunos ficheros o dispositivos no se hallÃŗ durante la inicializaciÃŗn. Compruebe que el nÃēcleo de "gpsbabel" estÃĄ instalado correctamente y que se halla en la RUTA actual. Este programa no puede continuar. - + Input and output formats do not support %1 Formatos de entrada y salida inadmisibles %1 @@ -581,68 +604,68 @@ This program cannot continue. Formatos de entrada inadmisible %1; Formatos de salida inadmisible %2 - + Input does not support %1; output format supports %1 Formatos de entrada inadmisible %1; Formatos de salida inadmisible %1 {1;?} - + Input format supports %1; output format does not support %1 - + Both input and output formats support %1 Formatos de entrada y salida admisibles (ambos) %1 - + waypoints Puntos de interÊs - + tracks Registro de trazados - + routes Rutas - + There are no input options for format "%1" No hay opciones de entrada para el formato "%1" - - + + Options for %1 Opciones de %1 - + There are no output options for format "%1" No hay opciones de salida para el formato "%1" - + No valid waypoints/routes/tracks translation specified Se han especificicado puntos de interÊs, trazados o rutas no traducibles - + No input file specified No se ha especificado el fichero de entrada - + No valid output specified El fichero de salida no es vÃĄlido - + No output file specified No se ha especificado el fichero de salida @@ -655,33 +678,33 @@ This program cannot continue. El proceso terminÃŗ sin suerte y con el cÃŗdigo %1 - + Translation successful TraducciÃŗn realizada con Êxito - + Error running gpsbabel: %1 Error ejecutando gpsbabel: %1 - + Are you sure you want to reset all format options to default values? ÂŋEstÃĄs seguro de que quieres volver a los formatos por defecto? - + About %1 Acerca de %1 - + One or more data filters are active Uno o mÃĄs filtros de datos estÃĄn activos - + No data filters are active NingÃēn filtro de datos estÃĄ activo @@ -922,17 +945,17 @@ This program cannot continue. Map - + Error opening "gmapbase.html" file. Check installation - + Missing "gmapbase.html" file. Check installation No se encuentra el fichero ""gmapbase.html". Compruebe la instalaciÃŗn - + Failed to load Google maps base page Fallo al buscar la pÃĄgina bÃĄsica de los mapas de Googe @@ -941,28 +964,28 @@ This program cannot continue. MiscFltWidget - - - - + + + + Tracks Trazados - - - - + + + + Waypoints Puntos de interÊs - - - - + + + + Routes Rutas @@ -1189,7 +1212,7 @@ Algunos formatos de datos de los GPS solo permiten utilizar una parte de los pun QObject - + Error processing formats from running process "gpsbabel -^3" at line %1 Error al procesar los formatos seleccionados en el proceso "gpsbabel -^3" en la línea %1 @@ -1398,7 +1421,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + days días @@ -1409,7 +1432,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + mins minutos @@ -1439,45 +1462,60 @@ Esta opciÃŗn se utiliza junto con la de parar (stop) para descartar puntos que f Comenzar - + + + If checked, times specified here are based on this computer's current time zone. + + + + + + If checked, times specified here are UTC. + + + + + UTC + + + If checked, time specified here is based on this computer's current time zone. - Si seleccionado, los datos especificados se basan en la zona horaria de tu ordenador. + Si seleccionado, los datos especificados se basan en la zona horaria de tu ordenador. - If checked, the times specified here are based on the local computer's time zone. Otherwise it is UTC. - Si seleccionado, los datos especificados se basan en la zona horaria de tu ordenador. En caso contrario, es UTC. + Si seleccionado, los datos especificados se basan en la zona horaria de tu ordenador. En caso contrario, es UTC. - + Local Time Hora local - - + + Use track pts before this time. Usa los puntos del trazado tomados antes de esta hora. - + Use only track points before this timestamp. This option is used in conjunction with the start option to discard all trackpoints outside of a given period of time. This option defines the end of the time period. Usa los puntos del trazado tomados antes de esta marca de tiempo. Esta opciÃŗn se usa junto con la opciÃŗn comenzar para descartar todos los puntos no tomados en determinado período temporal. Esta opciÃŗn define el final del período. - + Stop Parar - + Pack all tracks into one. Junta todos los trazados en uno. - + Pack all tracks into one. This option causes all tracks to be appended to one another to form a single track. This option does not work if any two tracks overlap in time; in that case, consider using the merge option. @@ -1490,17 +1528,17 @@ Esta opciÃŗn hace que todos los trazados se aÃąadan uno tras otros hasta formar Esta opciÃŗn es muy Ãētil para juntar trazados que se interrumpieron por un error en el equipo o por una parada para descansar. - + Pack Juntar - + Merge multiple tracks for the same way. Unir diversos trazados repetitivos. - + Merge multiple tracks for the same way. This option puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped. @@ -1509,12 +1547,12 @@ This option puts all track points from all tracks into a single track and sorts Esta opciÃŗn pone todos los puntos de todos los trazados en un Ãēnico trazado y los ordena por la marca de tiempo. Los puntos con idÊnticas marcas de tiempo son borrados. - + Merge Unir - + Split by Date Split tracks. Dividir trazados por fecha @@ -1537,42 +1575,42 @@ Si la entrada tiene mÃēltiples trazados, jÃēntalos antes de dividirlos por día. Dividir - + If nonzero, the track will be split if the time between two points is greater than this parameter. If zero, the track will be split by date. Si "nonzero", el trazado serÃĄ dividido si el tiempo entre dos puntos es mayor que el parÃĄmetro. Si "zero", el trazado serÃĄ dividido por día. - + hrs hrs - + Split by Dist. Dividir trazados por distancia. - + If nonzero, the input track will be split into several tracks if the distance between successive track points is greater than the distance given as a parameter. Si "nonzero", el trazado serÃĄ dividido en varios trazados si la distancia entre dos puntos es mayor que el parÃĄmetro dado. - + ft ft - + m m - + km Km - + mi mi @@ -1594,42 +1632,42 @@ Esta opciÃŗn fija el estatus de las correcciones GPS de todos los puntos del tra Esta opciÃŗn es muy Ãētil cuando se trata de convertir de un formato que no contiene ninguna correcciÃŗn GPS a uno que la requiere. - + GPS Fixes Correcciones GPS - + none ninguno - + pps pps - + dgps dgps - + 3d 3d - + 2d 2d - + Synthesize course. Sintetizar el rumbo. - + Synthesize course. This option computes (or recomputes) a value for the GPS heading at each trackpoint. This is most useful with trackpoints from formats that don't support heading information or for trackpoints synthesized by the interpolate filter. The heading at each trackpoint is simply the course from the previous trackpoint in the track. The first trackpoint in each track is arbitrarily assigned a heading of 0 degrees. @@ -1638,22 +1676,22 @@ This option computes (or recomputes) a value for the GPS heading at each trackpo Esta opciÃŗn calcula (o recalcula) un valor para el rumbo de cada punto del trazado. Es muy Ãētil para puntos de trazado en formatos que no contienen informaciÃŗn sobre el rumbo o para puntos de trazado calculados con el filtro interpolar. El rumbo de cada punto es simplemente la direcciÃŗn desde el punto previo en el trazado. El primer punto de cada trazado tiene el valor arbitrario de 0 grados. - + Course DirecciÃŗn - + Synthesize speed. Calcular velocidad. - + Split by Time Dividir trazados en funciÃŗn del tiempo - + Synthesize speed. This option computes a value for the GPS speed at each trackpoint. This is most useful with trackpoints from formats that don't support speed information or for trackpoints synthesized by the interpolate filter. The speed at each trackpoint is the average speed from the previous trackpoint (distance divided by time). The first trackpoint in each track is assigned a speed of "unknown." @@ -1662,7 +1700,7 @@ This option computes a value for the GPS speed at each trackpoint. This is most Esta opciÃŗn calcula (o recalcula) un valor para la velocidad de cada punto del trazado. Es muy Ãētil para puntos de trazado en formatos que no contienen informaciÃŗn sobre la velocidad o para puntos de trazado calculados con el filtro interpolar. La velocidad de cada punto es simplemente la media (distancia partido por tiempo) desde el punto previo en el trazado. El primer punto de cada trazado tiene el valor arbitrario de "desconocido". - + Speed Velocidad @@ -1678,44 +1716,44 @@ Esta opciÃŗn calcula (o recalcula) un valor para la velocidad de cada punto del UpgradeCheck - - - + + + HTTP HTTP - + Unexpected reply. - + Download failed: %1. La descarga fallÃŗ: %1. - + Download failed: %1: %2. - + Error Error - + Invalid return data at line %1: %2. Ha devuelto datos no vÃĄlidos en la línea %1: %2. - + A new version of GPSBabel is available.<br />Your version is %1 <br />The latest version is %2 Una nueva versiÃŗon de GPSBabel ha salido ya. <br />Tu versiÃŗn es la %1 <br />La Ãēltima versiÃŗon sería %2 - + Do you wish to download an upgrade? ÂŋQuieres bajarte una actualizaciÃŗn? @@ -1724,7 +1762,7 @@ Esta opciÃŗn calcula (o recalcula) un valor para la velocidad de cada punto del <center><b>Una nueva versiÃŗn de GPSBabel estÃĄ disponible </b><br>La versiÃŗn actual es %1 <br> La versiÃŗn mÃĄs reciente es %2</center> - + Upgrade Actualizar diff --git a/gui/gpsbabelfe_fr.qm b/gui/gpsbabelfe_fr.qm index 5210c7575..8a277d4db 100644 Binary files a/gui/gpsbabelfe_fr.qm and b/gui/gpsbabelfe_fr.qm differ diff --git a/gui/gpsbabelfe_fr.ts b/gui/gpsbabelfe_fr.ts index 13d403bfe..1575b5e41 100644 --- a/gui/gpsbabelfe_fr.ts +++ b/gui/gpsbabelfe_fr.ts @@ -16,12 +16,13 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -31,6 +32,28 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -432,128 +455,128 @@ Higher number provides more detailed diagnostics. MainWindow - + Select one or more input files - + Output File Name - + Error reading format configuration. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. - + Some file/device formats were not found during initialization. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. - + Input and output formats do not support %1 - + Input does not support %1; output format supports %1 - + Input format supports %1; output format does not support %1 - + Both input and output formats support %1 - + waypoints - + tracks - + routes - + There are no input options for format "%1" - - + + Options for %1 Options pour %1 - + There are no output options for format "%1" - + No valid waypoints/routes/tracks translation specified - + No input file specified - + No valid output specified - + No output file specified - + Translation successful - + Error running gpsbabel: %1 - + Are you sure you want to reset all format options to default values? - + About %1 - + One or more data filters are active - + No data filters are active @@ -782,17 +805,17 @@ This program cannot continue. Map - + Error opening "gmapbase.html" file. Check installation - + Missing "gmapbase.html" file. Check installation - + Failed to load Google maps base page @@ -801,28 +824,28 @@ This program cannot continue. MiscFltWidget - - - - + + + + Tracks Traces - - - - + + + + Waypoints Waypoints - - - - + + + + Routes Routes @@ -1014,7 +1037,7 @@ Some GPS data formats support only some subset of waypoints, tracks, and routes. QObject - + Error processing formats from running process "gpsbabel -^3" at line %1 @@ -1210,7 +1233,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + days @@ -1221,7 +1244,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + mins @@ -1249,45 +1272,35 @@ This option is used along with the stop to discard trackpoints that were recorde - - If checked, time specified here is based on this computer's current time zone. - - - - - If checked, the times specified here are based on the local computer's time zone. Otherwise it is UTC. - - - - + Local Time - - + + Use track pts before this time. - + Use only track points before this timestamp. This option is used in conjunction with the start option to discard all trackpoints outside of a given period of time. This option defines the end of the time period. - + Stop - + Pack all tracks into one. - + Pack all tracks into one. This option causes all tracks to be appended to one another to form a single track. This option does not work if any two tracks overlap in time; in that case, consider using the merge option. @@ -1296,139 +1309,156 @@ This option is most useful for rejoining tracks that might have been interrupted - + Pack - + Merge multiple tracks for the same way. - + Merge multiple tracks for the same way. This option puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped. - + Merge - + Split by Date Split tracks. - + If nonzero, the track will be split if the time between two points is greater than this parameter. If zero, the track will be split by date. - + hrs - + Split by Dist. - + If nonzero, the input track will be split into several tracks if the distance between successive track points is greater than the distance given as a parameter. - + ft - + m - + km - + mi - + GPS Fixes - + none - + pps - + dgps - + 3d - + 2d - + Synthesize course. - + Synthesize course. This option computes (or recomputes) a value for the GPS heading at each trackpoint. This is most useful with trackpoints from formats that don't support heading information or for trackpoints synthesized by the interpolate filter. The heading at each trackpoint is simply the course from the previous trackpoint in the track. The first trackpoint in each track is arbitrarily assigned a heading of 0 degrees. - + Course - + + + If checked, times specified here are based on this computer's current time zone. + + + + + + If checked, times specified here are UTC. + + + + + UTC + + + + Synthesize speed. - + Split by Time - + Synthesize speed. This option computes a value for the GPS speed at each trackpoint. This is most useful with trackpoints from formats that don't support speed information or for trackpoints synthesized by the interpolate filter. The speed at each trackpoint is the average speed from the previous trackpoint (distance divided by time). The first trackpoint in each track is assigned a speed of "unknown." - + Speed @@ -1444,49 +1474,49 @@ This option computes a value for the GPS speed at each trackpoint. This is most UpgradeCheck - - - + + + HTTP - + Unexpected reply. - + Download failed: %1. - + Download failed: %1: %2. - + Error - + Invalid return data at line %1: %2. - + A new version of GPSBabel is available.<br />Your version is %1 <br />The latest version is %2 - + Do you wish to download an upgrade? - + Upgrade diff --git a/gui/gpsbabelfe_hu.qm b/gui/gpsbabelfe_hu.qm index dbcefd6fc..af5aa8ce1 100644 Binary files a/gui/gpsbabelfe_hu.qm and b/gui/gpsbabelfe_hu.qm differ diff --git a/gui/gpsbabelfe_hu.ts b/gui/gpsbabelfe_hu.ts index d3aabb811..45337420a 100644 --- a/gui/gpsbabelfe_hu.ts +++ b/gui/gpsbabelfe_hu.ts @@ -16,12 +16,13 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -31,6 +32,28 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -432,128 +455,128 @@ Higher number provides more detailed diagnostics. MainWindow - + Select one or more input files - + Output File Name - + Error reading format configuration. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. - + Some file/device formats were not found during initialization. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. - + Input and output formats do not support %1 - + Input does not support %1; output format supports %1 - + Input format supports %1; output format does not support %1 - + Both input and output formats support %1 - + waypoints - + tracks - + routes - + There are no input options for format "%1" - - + + Options for %1 - + There are no output options for format "%1" - + No valid waypoints/routes/tracks translation specified - + No input file specified - + No valid output specified - + No output file specified - + Translation successful - + Error running gpsbabel: %1 - + Are you sure you want to reset all format options to default values? - + About %1 - + One or more data filters are active - + No data filters are active @@ -777,17 +800,17 @@ This program cannot continue. Map - + Error opening "gmapbase.html" file. Check installation - + Missing "gmapbase.html" file. Check installation - + Failed to load Google maps base page @@ -796,28 +819,28 @@ This program cannot continue. MiscFltWidget - - - - + + + + Tracks Nyomvonalak - - - - + + + + Waypoints Útpontok - - - - + + + + Routes Útvonalak @@ -1009,7 +1032,7 @@ Some GPS data formats support only some subset of waypoints, tracks, and routes. QObject - + Error processing formats from running process "gpsbabel -^3" at line %1 @@ -1205,7 +1228,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + days @@ -1216,7 +1239,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + mins @@ -1244,45 +1267,35 @@ This option is used along with the stop to discard trackpoints that were recorde - - If checked, time specified here is based on this computer's current time zone. - - - - - If checked, the times specified here are based on the local computer's time zone. Otherwise it is UTC. - - - - + Local Time - - + + Use track pts before this time. - + Use only track points before this timestamp. This option is used in conjunction with the start option to discard all trackpoints outside of a given period of time. This option defines the end of the time period. - + Stop - + Pack all tracks into one. - + Pack all tracks into one. This option causes all tracks to be appended to one another to form a single track. This option does not work if any two tracks overlap in time; in that case, consider using the merge option. @@ -1291,139 +1304,156 @@ This option is most useful for rejoining tracks that might have been interrupted - + Pack - + Merge multiple tracks for the same way. - + Merge multiple tracks for the same way. This option puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped. - + Merge - + Split by Date Split tracks. - + If nonzero, the track will be split if the time between two points is greater than this parameter. If zero, the track will be split by date. - + hrs - + Split by Dist. - + If nonzero, the input track will be split into several tracks if the distance between successive track points is greater than the distance given as a parameter. - + ft - + m - + km - + mi - + GPS Fixes - + none - + pps - + dgps - + 3d - + 2d - + Synthesize course. - + Synthesize course. This option computes (or recomputes) a value for the GPS heading at each trackpoint. This is most useful with trackpoints from formats that don't support heading information or for trackpoints synthesized by the interpolate filter. The heading at each trackpoint is simply the course from the previous trackpoint in the track. The first trackpoint in each track is arbitrarily assigned a heading of 0 degrees. - + Course - + + + If checked, times specified here are based on this computer's current time zone. + + + + + + If checked, times specified here are UTC. + + + + + UTC + + + + Synthesize speed. - + Split by Time - + Synthesize speed. This option computes a value for the GPS speed at each trackpoint. This is most useful with trackpoints from formats that don't support speed information or for trackpoints synthesized by the interpolate filter. The speed at each trackpoint is the average speed from the previous trackpoint (distance divided by time). The first trackpoint in each track is assigned a speed of "unknown." - + Speed @@ -1439,49 +1469,49 @@ This option computes a value for the GPS speed at each trackpoint. This is most UpgradeCheck - - - + + + HTTP - + Unexpected reply. - + Download failed: %1. - + Download failed: %1: %2. - + Error - + Invalid return data at line %1: %2. - + A new version of GPSBabel is available.<br />Your version is %1 <br />The latest version is %2 - + Do you wish to download an upgrade? - + Upgrade diff --git a/gui/gpsbabelfe_it.qm b/gui/gpsbabelfe_it.qm index ae4a8063d..ea6b259f6 100644 Binary files a/gui/gpsbabelfe_it.qm and b/gui/gpsbabelfe_it.qm differ diff --git a/gui/gpsbabelfe_it.ts b/gui/gpsbabelfe_it.ts index 6992ab4e7..1f2e589e6 100644 --- a/gui/gpsbabelfe_it.ts +++ b/gui/gpsbabelfe_it.ts @@ -16,12 +16,13 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -31,6 +32,28 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> @@ -698,17 +721,17 @@ Un numero piÚ alto fornisce un livello di diagnosi piÚ dettagliato.predefinite - + Select one or more input files Selezionare uno o piÚ file in ingresso - + Output File Name Nome del file in uscita - + Error reading format configuration. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. @@ -717,7 +740,7 @@ This program cannot continue. Questo programma non puÃ˛ proseguire. - + Some file/device formats were not found during initialization. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. @@ -726,7 +749,7 @@ This program cannot continue. Questo programma non puÃ˛ proseguire. - + Input and output formats do not support %1 I formati di ingresso e di uscita non supportano %1 @@ -739,68 +762,68 @@ Questo programma non puÃ˛ proseguire. Il formato in ingresso supporta %1, il formato di destinazione non supporta %2 - + Input does not support %1; output format supports %1 L'ingresso non supporta %1, il formato di destinazione supporta %1 {1;?} - + Input format supports %1; output format does not support %1 Il formato in ingresso supporta %1, il formato di destinazione non supporta %1 {1;?} - + Both input and output formats support %1 I formati di origine e di destinazione supportano %1 - + waypoints punti di interesse - + tracks tracce - + routes rotte - + There are no input options for format "%1" Non ci sono opzioni in ingresso per il formato "%1" - - + + Options for %1 Opzioni per %1 - + There are no output options for format "%1" Non ci sono opzioni in uscita per il formato "%1" - + No valid waypoints/routes/tracks translation specified Non è stato specificato alcun punto di interesse/rotta/traccia - + No input file specified Il file di origine non è stato specificato - + No valid output specified Non è stata specificata una destinazione valida - + No output file specified Il file di destinazione non è stato specificato @@ -813,34 +836,34 @@ Questo programma non puÃ˛ proseguire. Il processo è terminato con il codice di errorre %1 - + Translation successful Traduzione terminata con successo - + Error running gpsbabel: %1 Errore durante l'esecuzione di gpsbabel: %1 - + Are you sure you want to reset all format options to default values? Si è certi di voler reimpostare tutte le opzioni dei formati ai valori predefiniti? - + About %1 Informazioni su %1 - + One or more data filters are active È attivo uno o piÚ filtri di dati - + No data filters are active Nessun filtro di dati è attivo @@ -848,17 +871,17 @@ Questo programma non puÃ˛ proseguire. Map - + Error opening "gmapbase.html" file. Check installation - + Missing "gmapbase.html" file. Check installation Il file "gmapbase.html" manca. Verifica l'installazione - + Failed to load Google maps base page Non è stato possibile caricare la pagina di base delle mappe di Google @@ -882,28 +905,28 @@ Questo programma non puÃ˛ proseguire. - - - - + + + + Routes Rotte - - - - + + + + Tracks Tracce - - - - + + + + Waypoints Punti di interesse @@ -1114,7 +1137,7 @@ Qualche formato di dati del GPS supporta solo un sottoinsieme di punti di intere QObject - + Error processing formats from running process "gpsbabel -^3" at line %1 Si è verificato un errore durante l'elaborazione dei formati da parte del processo di lavoro "gpsbabel -^3" alla linea %1 @@ -1325,7 +1348,7 @@ Questa opzione modifica la data/l'ora di tutti i punti traccia. PuÃ˛ essere - + days giorni @@ -1336,7 +1359,7 @@ Questa opzione modifica la data/l'ora di tutti i punti traccia. PuÃ˛ essere - + mins minuti @@ -1366,28 +1389,26 @@ Questa opzione viene usata congiuntamente con lo stop per scartare i punti tracc Inizio - If checked, time specified here is based on this computer's current time zone. - Se selezionato, l'ora indicata qui è basata sul fuso orario impostato nel PC. + Se selezionato, l'ora indicata qui è basata sul fuso orario impostato nel PC. - If checked, the times specified here are based on the local computer's time zone. Otherwise it is UTC. - Se selezionato, gli orari specificati qui sono basati sul fuso orario del computer. Altrimenti saranno in UTC (fuso di Greenwich). + Se selezionato, gli orari specificati qui sono basati sul fuso orario del computer. Altrimenti saranno in UTC (fuso di Greenwich). - + Local Time Tempo locale - - + + Use track pts before this time. Usa i punti traccia prima di quest'ora. - + Use only track points before this timestamp. This option is used in conjunction with the start option to discard all trackpoints outside of a given period of time. This option defines the end of the time period. @@ -1396,17 +1417,17 @@ This option is used in conjunction with the start option to discard all trackpoi Questa opzione viene usata congiuntamente con l'inizio per scartare i punti traccia che sono stati salvati al di fuori di uno specifico intervallo temporale. Questa opzione specifica la fine dell'intervallo temporale. - + Stop Fine - + Pack all tracks into one. Concatena tutte le tracce in una. - + Pack all tracks into one. This option causes all tracks to be appended to one another to form a single track. This option does not work if any two tracks overlap in time; in that case, consider using the merge option. @@ -1419,17 +1440,17 @@ Questa opzione fa in modo che tutte le tracce vengano unite per formarne una sol Questa opzione è utile soprattutto per unire tracce che si sono interrotte per un malfunzionamento del dispositivo o per un arresto notturno. - + Pack Concatena - + Merge multiple tracks for the same way. Unisci piÚ tracce per la stessa strada. - + Merge multiple tracks for the same way. This option puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped. @@ -1438,97 +1459,97 @@ This option puts all track points from all tracks into a single track and sorts Questa opzione inserisce tutti i punti di ogni traccia in una singola traccia e li ordina in base all'orario. I punti con lo stesso orario saranno tralasciati. - + Merge Unisci - + Split by Date Suddividi per data - + Split by Time Suddividi per ora - + If nonzero, the track will be split if the time between two points is greater than this parameter. If zero, the track will be split by date. Se diverso da zero, la traccia verrà suddivisa se il tempo tra due punti è maggiore di questo parametro. Se zero, la traccia verrà suddivisa in base al giorno. - + hrs ore - + Split by Dist. Suddividi per distanza - + If nonzero, the input track will be split into several tracks if the distance between successive track points is greater than the distance given as a parameter. Se non zero, la traccia in ingresso verrà suddivisa in piÚ tracce se la distanza tra punti traccia successivi è maggiore della distanza specificata nel parametro. - + ft ft - + m m - + km km - + mi mi - + GPS Fixes Stato del GPS - + none nessuno - + pps pps - + dgps dgps - + 3d 3d - + 2d 2d - + Synthesize speed. Sintetizza la velocità. - + Synthesize speed. This option computes a value for the GPS speed at each trackpoint. This is most useful with trackpoints from formats that don't support speed information or for trackpoints synthesized by the interpolate filter. The speed at each trackpoint is the average speed from the previous trackpoint (distance divided by time). The first trackpoint in each track is assigned a speed of "unknown." @@ -1537,17 +1558,17 @@ This option computes a value for the GPS speed at each trackpoint. This is most Questa opzione calcola il valore della velocità GPS in ogni punto traccia. Risulta utile soprattutto con punti traccia tratti da un formato che non specifica informazioni sulla velocità o da punti traccia sintetizzati dal filtro di interpolazione. La velocità in ogni punto traccia è la velocità media calcolata dal punto precedente (distanza diviso il tempo). Al primo punto di ogni traccia viene assegnata una velocità "sconosciuta." - + Speed Velocità - + Synthesize course. Sintetizza la direzione. - + Synthesize course. This option computes (or recomputes) a value for the GPS heading at each trackpoint. This is most useful with trackpoints from formats that don't support heading information or for trackpoints synthesized by the interpolate filter. The heading at each trackpoint is simply the course from the previous trackpoint in the track. The first trackpoint in each track is arbitrarily assigned a heading of 0 degrees. @@ -1556,10 +1577,27 @@ This option computes (or recomputes) a value for the GPS heading at each trackpo Questa opzione calcola (o ricalcola) un valore per la direzione del GPS in ogni punto traccia. Risulta utile soprattutto con punti traccia tratti da un formato che non specifica informazioni sulla direzione o da punti traccia sintetizzati dal filtro di interpolazione. La direzione in ogni punto traccia è tratta semplicemente dalla posizione del punto traccia precedente nella traccia stessa. Al primo punto di ogni traccia viene arbitrariamente assegnato un valore pari a 0 gradi. - + Course Direzione + + + + If checked, times specified here are based on this computer's current time zone. + + + + + + If checked, times specified here are UTC. + + + + + UTC + + Upgrade @@ -1572,49 +1610,49 @@ Questa opzione calcola (o ricalcola) un valore per la direzione del GPS in ogni UpgradeCheck - - - + + + HTTP HTTP - + Unexpected reply. - + Download failed: %1. Scaricamento non riuscito: %1. - + Download failed: %1: %2. - + Error Errore - + Invalid return data at line %1: %2. Dati ricevuti non validi alla linea %1: %2. - + A new version of GPSBabel is available.<br />Your version is %1 <br />The latest version is %2 È disponibile una nuova versione di GPSBabel.<br />Versione corrente: %1 <br />Nuova versione: %2 - + Upgrade Aggiorna - + Do you wish to download an upgrade? Si desidera scaricare un aggiornamento? diff --git a/gui/gpsbabelfe_ru.qm b/gui/gpsbabelfe_ru.qm index 8ce1120c1..c18bfd4ad 100644 Binary files a/gui/gpsbabelfe_ru.qm and b/gui/gpsbabelfe_ru.qm differ diff --git a/gui/gpsbabelfe_ru.ts b/gui/gpsbabelfe_ru.ts index d1fb2ad19..df0e138b5 100644 --- a/gui/gpsbabelfe_ru.ts +++ b/gui/gpsbabelfe_ru.ts @@ -6,7 +6,7 @@ About GPSBabel - О GPSBabel + О ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧĐĩ GPSBabel @@ -16,12 +16,13 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2023 Robert Lipe</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -31,18 +32,41 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2009-2022 Robert Lipe</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GUI designed and contributed by S. Khai Mong</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">LGPL Crystal Icons by Elvarado Coehlo</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Using backend $babelversion$)</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Installation ID: $installationId$</p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:12pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">$appname$</span></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$babelfeversion$</p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">АвŅ‚ĐžŅ€ŅĐēĐžĐĩ ĐŋŅ€Đ°Đ˛Đž (C) Robert Lipe, 2009-2022</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">АвŅ‚ĐžŅ€ŅĐēĐžĐĩ ĐŋŅ€Đ°Đ˛Đž (C) Robert Lipe, 2009-2023</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ГŅ€Đ°Ņ„иŅ‡ĐĩŅĐēиК иĐŊŅ‚ĐĩŅ€Ņ„ĐĩĐšŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ Ņ€Đ°ĐˇŅ€Đ°ĐąĐžŅ‚Đ°ĐŊ и ĐŋŅ€ĐĩĐ´ĐžŅŅ‚авĐģĐĩĐŊ S. Khai Mong</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">КŅ€Đ¸ŅŅ‚Đ°ĐģŅŒĐŊŅ‹Đĩ СĐŊĐ°Ņ‡Đēи LGPL авŅ‚ĐžŅ€ŅŅ‚ва Elvarado Coehlo</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ĐŧОдŅƒĐģŅŒ $babelversion$)</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$hash$</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$date$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">$upgradetestmode$</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ИдĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ‚ĐžŅ€ ŅƒŅŅ‚Đ°ĐŊОвĐēи: $installationId$</p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> @@ -312,7 +336,7 @@ Higher number provides more detailed diagnostics. Help - ПоĐŧĐžŅ‰ŅŒ + ĐĄĐŋŅ€Đ°Đ˛ĐēĐ° @@ -670,7 +694,7 @@ Higher number provides more detailed diagnostics. Help - ПоĐŧĐžŅ‰ŅŒ + ĐĄĐŋŅ€Đ°Đ˛ĐēĐ° @@ -712,17 +736,17 @@ Higher number provides more detailed diagnostics. ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ - + Select one or more input files ВŅ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ОдиĐŊ иĐģи ĐŊĐĩŅĐēĐžĐģŅŒĐēĐž Ņ„Đ°ĐšĐģОв - + Output File Name ИĐŧŅ вŅ‹Ņ…ОдĐŊĐžĐŗĐž Ņ„Đ°ĐšĐģĐ° - + Error reading format configuration. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. @@ -731,7 +755,7 @@ This program cannot continue. ВŅ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊĐž. - + Some file/device formats were not found during initialization. Check that the backend program "gpsbabel" is properly installed and is in the current PATH This program cannot continue. @@ -740,7 +764,7 @@ This program cannot continue. ВŅ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐĩĐŊĐž. - + Input and output formats do not support %1 ВŅ…ОдĐŊОК и вŅ‹Ņ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ‹ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваŅŽŅ‚ %1 @@ -753,68 +777,68 @@ This program cannot continue. ВŅ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ %1; вŅ‹Ņ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚t %2 - + Input does not support %1; output format supports %1 ВŅ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ %1; вŅ‹Ņ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ %1 - + Input format supports %1; output format does not support %1 ВŅ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ %1; вŅ‹Ņ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚t %1 - + Both input and output formats support %1 ВŅ…ОдĐŊОК и вŅ‹Ņ…ОдĐŊОК Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŋОддĐĩŅ€ĐļиваŅŽŅ‚ %1 - + waypoints ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи - + tracks Ņ‚Ņ€ĐĩĐēи - + routes ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ņ‹ - + There are no input options for format "%1" НĐĩŅ‚ вŅ…ОдĐŊŅ‹Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛ Đ´ĐģŅ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ° "%1" - - + + Options for %1 ПаŅ€Đ°ĐŧĐĩŅ‚Ņ€Ņ‹ %1 - + There are no output options for format "%1" НĐĩŅ‚ вŅ‹Ņ…ОдĐŊŅ‹Ņ… ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛ Đ´ĐģŅ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ° "%1" - + No valid waypoints/routes/tracks translation specified НĐĩ вŅ‹ĐąŅ€Đ°ĐŊĐž ĐŋŅ€ĐĩОйŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиĐĩ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Ņ… Ņ‚ĐžŅ‡ĐĩĐē/ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ов/Ņ‚Ņ€ĐĩĐēОв - + No input file specified НĐĩ вŅ‹ĐąŅ€Đ°ĐŊ вŅ…ОдĐŊОК Ņ„Đ°ĐšĐģ - + No valid output specified НĐĩ вŅ‹ĐąŅ€Đ°ĐŊ вŅ‹Ņ…ОдĐŊОК Ņ„Đ°ĐšĐģ - + No output file specified НĐĩ вŅ‹ĐąŅ€Đ°ĐŊ вŅ‹Ņ…ОдĐŊОК Ņ„Đ°ĐšĐģ @@ -827,33 +851,33 @@ This program cannot continue. ПŅ€ĐžŅ†ĐĩŅŅ СавĐĩŅ€ŅˆĐ¸ĐģŅŅ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐĩĐš Ņ ĐēОдОĐŧ %1 - + Translation successful КоĐŊвĐĩŅ€Ņ‚Đ°Ņ†Đ¸Ņ вŅ‹ĐŋĐžĐģĐŊĐĩĐŊĐ° - + Error running gpsbabel: %1 ОŅˆĐ¸ĐąĐēĐ° СаĐŋŅƒŅĐēĐ° gpsbabel: %1 - + Are you sure you want to reset all format options to default values? ВŅ‹ Đ´ĐĩĐšŅŅ‚виŅ‚ĐĩĐģŅŒĐŊĐž ĐļĐĩĐģĐ°ĐĩŅ‚Đĩ ŅĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ вŅĐĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ‹ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ° в СĐŊĐ°Ņ‡ĐĩĐŊиŅ ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ? - + About %1 О %1 - + One or more data filters are active ОдиĐŊ иĐģи йОĐģĐĩĐĩ Ņ„иĐģŅŒŅ‚Ņ€ĐžĐ˛ Đ´Đ°ĐŊĐŊŅ‹Ņ… Đ°ĐēŅ‚ивĐŊŅ‹ - + No data filters are active ФиĐģŅŒŅ‚Ņ€Ņ‹ Đ´Đ°ĐŊĐŊŅ‹Ņ… ĐŊĐĩ Đ°ĐēŅ‚ивĐŊŅ‹ @@ -861,17 +885,17 @@ This program cannot continue. Map - + Error opening "gmapbase.html" file. Check installation ОŅˆĐ¸ĐąĐēĐ° ĐžŅ‚ĐēŅ€Ņ‹Ņ‚иŅ Ņ„Đ°ĐšĐģĐ° "gmapbase.html". ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŋĐĩŅ€ĐĩŅƒŅŅ‚Đ°ĐŊОвиŅ‚ŅŒ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅƒ - + Missing "gmapbase.html" file. Check installation ОŅ‚ŅŅƒŅ‚ŅŅ‚вŅƒĐĩŅ‚ Ņ„Đ°ĐšĐģ "gmapbase.html". ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŋĐĩŅ€ĐĩŅƒŅŅ‚Đ°ĐŊОвиŅ‚ŅŒ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅƒ - + Failed to load Google maps base page НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ СаĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ йаСОвŅƒŅŽ ŅŅ‚Ņ€Đ°ĐŊиŅ†Ņƒ Google Maps @@ -895,28 +919,28 @@ This program cannot continue. - - - - + + + + Routes МаŅ€ŅˆŅ€ŅƒŅ‚Ņ‹ - - - - + + + + Tracks ĐĸŅ€ĐĩĐēи - - - - + + + + Waypoints МаŅ€ŅˆŅ€ŅƒŅ‚ĐŊŅ‹Đĩ Ņ‚ĐžŅ‡Đēи @@ -1028,7 +1052,7 @@ Some GPS data formats support only some subset of waypoints, tracks, and routes. Help - ПоĐŧĐžŅ‰ŅŒ + ĐĄĐŋŅ€Đ°Đ˛ĐēĐ° @@ -1127,7 +1151,7 @@ Some GPS data formats support only some subset of waypoints, tracks, and routes. QObject - + Error processing formats from running process "gpsbabel -^3" at line %1 ОŅˆĐ¸ĐąĐēĐ° ОйŅ€Đ°ĐąĐžŅ‚Đēи Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ов ĐŋŅ€Đ¸ СаĐŋŅƒŅĐēĐĩ ĐŋŅ€ĐžŅ†ĐĩŅŅĐ° "gpsbabel -^3" в ŅŅ‚Ņ€ĐžĐēĐĩ %1 @@ -1288,7 +1312,7 @@ Additionally, if you're using this to reverse a route that navigates, say, Track Filters - ФиĐģŅŒŅ‚Ņ€ ĐĸŅ€ĐĩĐēОв + ФиĐģŅŒŅ‚Ņ€ Ņ‚Ņ€ĐĩĐēОв @@ -1338,7 +1362,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + days Đ´ĐŊĐĩĐš @@ -1349,7 +1373,7 @@ This option changes the time of all trackpoints. This might be useful if your tr - + mins ĐŧиĐŊ @@ -1379,28 +1403,26 @@ This option is used along with the stop to discard trackpoints that were recorde НаŅ‡Đ°ĐģĐž - If checked, time specified here is based on this computer's current time zone. - ЕŅĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐž, Ņ‚Đž вŅ€ĐĩĐŧŅ, ŅƒĐēаСаĐŊĐŊĐžĐĩ СдĐĩŅŅŒ, ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒĐĩŅ‚ вŅ€ĐĩĐŧĐĩĐŊи, ŅƒĐēаСаĐŊĐŊĐžĐŧŅƒ ĐŊĐ° ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đĩ. + ЕŅĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐž, Ņ‚Đž вŅ€ĐĩĐŧŅ, ŅƒĐēаСаĐŊĐŊĐžĐĩ СдĐĩŅŅŒ, ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒĐĩŅ‚ вŅ€ĐĩĐŧĐĩĐŊи, ŅƒĐēаСаĐŊĐŊĐžĐŧŅƒ ĐŊĐ° ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đĩ. - If checked, the times specified here are based on the local computer's time zone. Otherwise it is UTC. - ЕŅĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐž, Ņ‚Đž вŅ€ĐĩĐŧŅ, ŅƒĐēаСаĐŊĐŊĐžĐĩ СдĐĩŅŅŒ, ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒĐĩŅ‚ вŅ€ĐĩĐŧĐĩĐŊи, ŅƒĐēаСаĐŊĐŊĐžĐŧŅƒ ĐŊĐ° ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đĩ. ИĐŊĐ°Ņ‡Đĩ - UTC. + ЕŅĐģи вĐēĐģŅŽŅ‡ĐĩĐŊĐž, Ņ‚Đž вŅ€ĐĩĐŧŅ, ŅƒĐēаСаĐŊĐŊĐžĐĩ СдĐĩŅŅŒ, ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒĐĩŅ‚ вŅ€ĐĩĐŧĐĩĐŊи, ŅƒĐēаСаĐŊĐŊĐžĐŧŅƒ ĐŊĐ° ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đĩ. ИĐŊĐ°Ņ‡Đĩ - UTC. - + Local Time МĐĩŅŅ‚ĐŊĐžĐĩ вŅ€ĐĩĐŧŅ - - + + Use track pts before this time. ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēĐ° Đ´Đž ŅŅ‚ĐžĐŗĐž вŅ€ĐĩĐŧĐĩĐŊи. - + Use only track points before this timestamp. This option is used in conjunction with the start option to discard all trackpoints outside of a given period of time. This option defines the end of the time period. @@ -1409,17 +1431,17 @@ This option is used in conjunction with the start option to discard all trackpoi Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ иŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ вĐŧĐĩŅŅ‚Đĩ ŅĐž вŅ€ĐĩĐŧĐĩĐŊĐĩĐŧ ĐŊĐ°Ņ‡Đ°ĐģĐ°, Ņ‡Ņ‚ОйŅ‹ ŅƒĐ´Đ°ĐģиŅ‚ŅŒ Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēĐ° ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊŅ‹Đĩ вĐŊĐĩ СадаĐŊĐŊĐžĐŗĐž вŅ€ĐĩĐŧĐĩĐŊĐŊĐžĐŗĐž диаĐŋаСОĐŊĐ°. Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ СадаĐĩŅ‚ ĐēĐžĐŊĐĩŅ† диаĐŋаСОĐŊĐ°. - + Stop КоĐŊĐĩŅ† - + Pack all tracks into one. ĐŖĐŋĐ°ĐēОваŅ‚ŅŒ вŅĐĩ Ņ‚Ņ€ĐĩĐēи в ОдиĐŊ. - + Pack all tracks into one. This option causes all tracks to be appended to one another to form a single track. This option does not work if any two tracks overlap in time; in that case, consider using the merge option. @@ -1432,17 +1454,17 @@ This option is most useful for rejoining tracks that might have been interrupted ПоĐģĐĩСĐĩĐŊ Đ´ĐģŅ ОйŅŠĐĩдиĐŊĐĩĐŊиŅ Ņ‚Ņ€ĐĩĐēОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŧĐžĐŗĐģи ĐąŅ‹Ņ‚ŅŒ Ņ€Đ°ĐˇĐžŅ€Đ˛Đ°ĐŊŅ‹ иС-Са ĐŋĐĩŅ€ĐĩйОĐĩв в Ņ€Đ°ĐąĐžŅ‚Đĩ ĐŋŅ€Đ¸ĐąĐžŅ€Đ° иĐģи ĐžŅŅ‚Đ°ĐŊОвĐēи ĐŊĐ° ĐŊĐžŅ‡ŅŒ. - + Pack ĐŖĐŋĐ°ĐēОваŅ‚ŅŒ - + Merge multiple tracks for the same way. ĐĄĐēĐģĐĩиŅ‚ŅŒ ĐŊĐĩŅĐēĐžĐģŅŒĐēĐž Ņ‚Ņ€ĐĩĐēОв Đ´ĐģŅ Ņ‚ĐžĐŗĐž ĐļĐĩ ĐŋŅƒŅ‚и. - + Merge multiple tracks for the same way. This option puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped. @@ -1451,97 +1473,97 @@ This option puts all track points from all tracks into a single track and sorts Đ­Ņ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ ŅĐēĐģĐ°Đ´Ņ‹Đ˛Đ°ĐĩŅ‚ вŅĐĩ Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēĐ° иС вŅĐĩŅ… Ņ‚Ņ€ĐĩĐēОв в ĐĩдиĐŊŅ‹Đš Ņ‚Ņ€ĐĩĐē и ŅĐžŅ€Ņ‚иŅ€ŅƒĐĩŅ‚ иŅ… ĐŋĐž вŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đŧ ĐŧĐĩŅ‚ĐēĐ°Đŧ. ĐĸĐžŅ‡Đēи Ņ ОдиĐŊĐ°ĐēОвŅ‹Đŧи ĐŧĐĩŅ‚ĐēĐ°Đŧи - ŅƒĐ´Đ°ĐģŅŅŽŅ‚ŅŅ. - + Merge ĐĄĐēĐģĐĩиŅ‚ŅŒ - + Split by Date РаСйиŅ‚ŅŒ ĐŋĐž Đ´Đ°Ņ‚Đĩ - + Split by Time РаСйиŅ‚ŅŒ ĐŋĐž вŅ€ĐĩĐŧĐĩĐŊи - + If nonzero, the track will be split if the time between two points is greater than this parameter. If zero, the track will be split by date. ЕŅĐģи ĐŊĐĩ 0, Ņ‚Ņ€ĐĩĐē ĐąŅƒĐ´ĐĩŅ‚ Ņ€Đ°ĐˇĐąĐ¸Ņ‚ ĐĩŅĐģи вŅ€ĐĩĐŧŅ ĐŧĐĩĐļĐ´Ņƒ двŅƒĐŧŅ Ņ‚ĐžŅ‡ĐēĐ°Đŧи йОĐģŅŒŅˆĐĩ, Ņ‡ĐĩĐŧ ŅŅ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ. ЕŅĐģи ĐŊĐžĐģŅŒ, Ņ‚Ņ€ĐĩĐē ĐąŅƒĐ´ĐĩŅ‚ Ņ€Đ°ĐˇĐąĐ¸Ņ‚ ĐŋĐž Đ´Đ°Ņ‚Đĩ. - + hrs Ņ‡ - + Split by Dist. РаСйиŅ‚ŅŒ ĐŋĐž Ņ€Đ°ŅŅŅ‚ĐžŅĐŊиŅŽ - + If nonzero, the input track will be split into several tracks if the distance between successive track points is greater than the distance given as a parameter. ЕŅĐģи ĐŊĐĩ 0, иŅŅ…ОдĐŊŅ‹Đš Ņ‚Ņ€ĐĩĐē ĐąŅƒĐ´ĐĩŅ‚ Ņ€Đ°ĐˇĐąĐ¸Ņ‚ ĐŊĐ° ĐŊĐĩŅĐēĐžĐģŅŒĐēĐž Ņ‚Ņ€ĐĩĐēОв ĐĩŅĐģи Ņ€Đ°ŅŅŅ‚ĐžŅĐŊиĐĩ ĐŧĐĩĐļĐ´Ņƒ ĐŋĐžŅĐģĐĩдОваŅ‚ĐĩĐģŅŒĐŊŅ‹Đŧи Ņ‚ĐžŅ‡ĐēĐ°Đŧи йОĐģŅŒŅˆĐĩ, Ņ‡ĐĩĐŧ СадаĐŊĐŊĐžĐĩ. - + ft Ņ„ŅƒŅ‚Ов - + m Đŧ - + km ĐēĐŧ - + mi ĐŧиĐģŅŒ - + GPS Fixes GPS ĐŋĐžĐŋŅ€Đ°Đ˛Đēи - + none ĐŊĐĩŅ‚ - + pps - + dgps - + 3d - + 2d - + Synthesize speed. ХиĐŊŅ‚ĐĩСиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐēĐžŅ€ĐžŅŅ‚ŅŒ. - + Synthesize speed. This option computes a value for the GPS speed at each trackpoint. This is most useful with trackpoints from formats that don't support speed information or for trackpoints synthesized by the interpolate filter. The speed at each trackpoint is the average speed from the previous trackpoint (distance divided by time). The first trackpoint in each track is assigned a speed of "unknown." @@ -1550,17 +1572,17 @@ This option computes a value for the GPS speed at each trackpoint. This is most Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋОСвОĐģŅĐĩŅ‚ вŅ‹Ņ‡Đ¸ŅĐģиŅ‚ŅŒ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ŅĐēĐžŅ€ĐžŅŅ‚и в ĐēĐ°ĐļдОК Ņ‚ĐžŅ‡ĐēĐĩ Ņ‚Ņ€ĐĩĐēĐ°. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŊадОйиŅ‚ŅŅ Đ´ĐģŅ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ов, ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваŅŽŅ‰Đ¸Ņ… ŅĐēĐžŅ€ĐžŅŅ‚ŅŒ, иĐģи Đ´ĐģŅ Ņ‚ĐžŅ‡ĐĩĐē, ŅĐ¸ĐŊŅ‚ĐĩСиŅ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Ņ… Ņ„иĐģŅŒŅ‚Ņ€ĐžĐŧ иĐŊŅ‚ĐĩŅ€ĐŋĐžĐģŅŅ†Đ¸Đ¸. ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ в ĐēĐ°ĐļдОК Ņ‚ĐžŅ‡ĐēĐĩ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ŅŅ€ĐĩĐ´ĐŊĐĩĐš ŅĐēĐžŅ€ĐžŅŅ‚ŅŒŅŽ ĐžŅ‚ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐš Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēĐ° (Ņ€Đ°ŅŅŅ‚ĐžŅĐŊиĐĩ, Đ´ĐĩĐģĐĩĐŊĐŊĐžĐĩ ĐŊĐ° вŅ€ĐĩĐŧŅ). ПĐĩŅ€Đ˛Đ°Ņ Ņ‚ĐžŅ‡ĐēĐ° ĐēĐ°ĐļĐ´ĐžĐŗĐž Ņ‚Ņ€ĐĩĐēĐ° ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ "unknown." - + Speed ĐĄĐēĐžŅ€ĐžŅŅ‚ŅŒ - + Synthesize course. ХиĐŊŅ‚ĐĩСиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐēŅƒŅ€Ņ. - + Synthesize course. This option computes (or recomputes) a value for the GPS heading at each trackpoint. This is most useful with trackpoints from formats that don't support heading information or for trackpoints synthesized by the interpolate filter. The heading at each trackpoint is simply the course from the previous trackpoint in the track. The first trackpoint in each track is arbitrarily assigned a heading of 0 degrees. @@ -1569,10 +1591,27 @@ This option computes (or recomputes) a value for the GPS heading at each trackpo Đ­Ņ‚Đ° ĐžĐŋŅ†Đ¸Ņ ĐŋОСвОĐģŅĐĩŅ‚ вŅ‹Ņ‡Đ¸ŅĐģиŅ‚ŅŒ (иĐģи ĐŋĐĩŅ€ĐĩŅŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ) СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ Đ´ĐģŅ ĐēŅƒŅ€ŅĐ° GPS в ĐēĐ°ĐļдОК Ņ‚ĐžŅ‡ĐēĐĩ Ņ‚Ņ€ĐĩĐēĐ°. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐŋĐžĐŊадОйиŅ‚ŅŅ Đ´ĐģŅ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ов, ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваŅŽŅ‰Đ¸Ņ… аСиĐŧŅƒŅ‚ иĐģи Đ´ĐģŅ Ņ‚ĐžŅ‡ĐĩĐē, ŅĐ¸ĐŊŅ‚ĐĩСиŅ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Ņ… Ņ„иĐģŅŒŅ‚Ņ€ĐžĐŧ иĐŊŅ‚ĐĩŅ€ĐŋĐžĐģŅŅ†Đ¸Đ¸. АСиĐŧŅƒŅ‚ в ĐēĐ°ĐļдОК Ņ‚ĐžŅ‡ĐēĐĩ ŅĐ˛ĐģŅĐĩŅ‚ŅŅ ĐŋŅ€ĐžŅŅ‚Ņ‹Đŧ ŅƒĐŗĐģĐžĐŧ ĐžŅ‚ ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰ĐĩĐš Ņ‚ĐžŅ‡Đēи Ņ‚Ņ€ĐĩĐēĐ°. ПĐĩŅ€Đ˛Đ°Ņ Ņ‚ĐžŅ‡ĐēĐ° ĐēĐ°ĐļĐ´ĐžĐŗĐž Ņ‚Ņ€ĐĩĐēĐ° ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ 0 ĐŗŅ€Đ°Đ´ŅƒŅĐžĐ˛. - + Course КŅƒŅ€Ņ + + + + If checked, times specified here are based on this computer's current time zone. + ЕŅĐģи Ņ„ĐģĐ°ĐļĐžĐē ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ, ŅƒĐēаСаĐŊĐŊĐžĐĩ СдĐĩŅŅŒ вŅ€ĐĩĐŧŅ ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒĐĩŅ‚ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŧŅƒ Ņ‡Đ°ŅĐžĐ˛ĐžĐŧŅƒ ĐŋĐžŅŅŅƒ ŅŅ‚ĐžĐŗĐž ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đ°. + + + + + If checked, times specified here are UTC. + ЕŅĐģи Ņ„ĐģĐ°ĐļĐžĐē ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ, ŅƒĐēаСаĐŊĐŊĐžĐĩ СдĐĩŅŅŒ вŅ€ĐĩĐŧŅ ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вŅƒĐĩŅ‚ UTC. + + + + UTC + UTC + Upgrade @@ -1585,49 +1624,49 @@ This option computes (or recomputes) a value for the GPS heading at each trackpo UpgradeCheck - - - + + + HTTP - + Unexpected reply. НĐĩĐžĐļидаĐŊĐŊŅ‹Đš ĐžŅ‚вĐĩŅ‚. - + Download failed: %1. ЗаĐŗŅ€ŅƒĐˇĐēĐ° СавĐĩŅ€ŅˆĐ¸ĐģĐ°ŅŅŒ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐĩĐš: %1. - + Download failed: %1: %2. ЗаĐŗŅ€ŅƒĐˇĐēĐ° СавĐĩŅ€ŅˆĐ¸ĐģĐ°ŅŅŒ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐĩĐš: %1: %2. - + Error ОŅˆĐ¸ĐąĐēĐ° - + Invalid return data at line %1: %2. НĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ вОСвŅ€Đ°Ņ‰ĐĩĐŊŅ‹ в ŅŅ‚Ņ€ĐžĐēĐĩ %1: %2. - + A new version of GPSBabel is available.<br />Your version is %1 <br />The latest version is %2 ДоŅŅ‚ŅƒĐŋĐŊĐ° ĐŊОваŅ вĐĩŅ€ŅĐ¸Ņ GPSBabel.<br />ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧĐ°Ņ вĐĩŅ€ŅĐ¸Ņ %1 <br />ПоŅĐģĐĩĐ´ĐŊŅŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐ°Ņ вĐĩŅ€ŅĐ¸Ņ %2 - + Upgrade ОбĐŊОвиŅ‚ŅŒ - + Do you wish to download an upgrade? ЗаĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ОйĐŊОвĐģĐĩĐŊиĐĩ? diff --git a/gui/gpx.cc b/gui/gpx.cc index 93168f2c0..32c99b31f 100644 --- a/gui/gpx.cc +++ b/gui/gpx.cc @@ -32,7 +32,7 @@ static QDateTime decodeDateTime(const QString& s) { - QDateTime utc = QDateTime::fromString(s, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + QDateTime utc = QDateTime::fromString(s, u"yyyy-MM-dd'T'HH:mm:ss'Z'"); return utc; } diff --git a/gui/main.cc b/gui/main.cc index 60788074e..84b08c1fe 100644 --- a/gui/main.cc +++ b/gui/main.cc @@ -32,7 +32,7 @@ int main(int argc, char** argv) // MIN_QT_VERSION in GPSBabel.pro should correspond to the QT_VERSION_CHECK // arguments in main.cc and gui/main.cc and the version check in // CMakeLists.txt, gui/CMakeLists.txt. -#if (QT_VERSION < QT_VERSION_CHECK(5, 12, 0)) +#if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) #error this version of Qt is not supported. #endif diff --git a/gui/mainwindow.cc b/gui/mainwindow.cc index 21352c239..054169a4c 100644 --- a/gui/mainwindow.cc +++ b/gui/mainwindow.cc @@ -178,13 +178,9 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) connect(ui_.actionUpgradeCheck, &QAction::triggered, this, &MainWindow::upgradeCheckActionX); connect(ui_.actionPreferences, &QAction::triggered, this, &MainWindow::preferencesActionX); -// TODO: Qt6 deleted the obsolete overloaded signal QComboBox::currentIndexChanged(const QString &text) -// that required using qOverload. - connect(ui_.inputFormatCombo, qOverload(&QComboBox::currentIndexChanged), + connect(ui_.inputFormatCombo, &QComboBox::currentIndexChanged, this, &MainWindow::inputFormatChanged); -// TODO: Qt6 deleted the obsolete overloaded signal QComboBox::currentIndexChanged(const QString &text) -// that required using qOverload. - connect(ui_.outputFormatCombo, qOverload(&QComboBox::currentIndexChanged), + connect(ui_.outputFormatCombo, &QComboBox::currentIndexChanged, this, &MainWindow::outputFormatChanged); connect(ui_.inputOptionsBtn, &QAbstractButton::clicked, this, &MainWindow::inputOptionButtonClicked); @@ -270,11 +266,7 @@ void MainWindow::switchTranslator(QTranslator& translator, const QString& filena const QStringList directories = { QApplication::applicationDirPath() + "/translations", ":/translations", -#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) - QLibraryInfo::location(QLibraryInfo::TranslationsPath) -#else QLibraryInfo::path(QLibraryInfo::TranslationsPath) -#endif }; // Load the new translator. diff --git a/gui/makesetup.bat b/gui/makesetup.bat deleted file mode 100644 index 08531a67a..000000000 --- a/gui/makesetup.bat +++ /dev/null @@ -1,76 +0,0 @@ -rem $Id: makesetup.bat,v 1.2 2010-06-27 21:13:07 robertl Exp $ -rem -rem Copy the Qt stuff into a local directory. The Inno Setup compiler -rem cannot handle %QTDIR environment variable in the source file -rem specification - -echo off -rd /q /s qtdir -mkdir qtdir -mkdir qtdir\bin -mkdir qtdir\translations -mkdir qtdir\plugins -mkdir qtdir\plugins\imageformats -mkdir qtdir\plugins\platforms -mkdir qtdir\mingw - -rem Basic Qt runtime DLLs -rem if "%QTDIR%"=="" call \QtSDK\Desktop\Qt\4.7.4\mingw\bin\qtenv2.bat -rem if "%QTDIR%"=="" call \Qt\Qt5.2.1\5.2.1\mingw48_32\bin\qtenv2.bat -if "%QTDIR%"=="" set QTDIR=c:\Qt\Qt5.2.1\5.2.1\mingw48_32 -copy %QTDIR%\bin\icu*.dll qtdir\bin -copy %QTDIR%\bin\libgcc_s_dw2-1.dll qtdir\bin -copy %QTDIR%\bin\libstdc*.dll qtdir\bin -copy %QTDIR%\bin\libwinpthread*.dll qtdir\bin -copy %QTDIR%\bin\Qt5Core.dll qtdir\bin -copy %QTDIR%\bin\Qt5Gui.dll qtdir\bin -copy %QTDIR%\bin\Qt5Multimedia.dll qtdir\bin -copy %QTDIR%\bin\Qt5MultimediaWidgets.dll qtdir\bin -copy %QTDIR%\bin\Qt5Network.dll qtdir\bin -copy %QTDIR%\bin\Qt5OpenGL.dll qtdir\bin -copy %QTDIR%\bin\Qt5Positioning.dll qtdir\bin -copy %QTDIR%\bin\Qt5PrintSupport.dll qtdir\bin -copy %QTDIR%\bin\Qt5Qml.dll qtdir\bin -copy %QTDIR%\bin\Qt5Quick.dll qtdir\bin -copy %QTDIR%\bin\Qt5Sensors.dll qtdir\bin -copy %QTDIR%\bin\Qt5Sql.dll qtdir\bin -copy %QTDIR%\bin\Qt5Webkit.dll qtdir\bin -copy %QTDIR%\bin\Qt5WebkitWidgets.dll qtdir\bin -copy %QTDIR%\bin\Qt5Widgets.dll qtdir\bin -copy %QTDIR%\bin\Qt5Xml.dll qtdir\bin - -rem Image format plugins needed at runtime, but not debug verions -xcopy %QTDIR%\plugins\imageformats qtdir\plugins\imageformats -xcopy %QTDIR%\plugins\platforms qtdir\plugins\platforms -rem del qtdir\plugins\imageformats\*d4*.dll -rem del qtdir\plugins\imageformats\lib*d4*.a - -rem Mingw runtime support -copy %QTDIR%\..\mingw\bin\mingwm10.dll qtdir\mingw - -rem Copy QT's own translations (Apply/OK, and the like) -copy %QTDIR%\translations\qt_*.qm qtdir\translations -del qtdir\translations\qt_help* - -rem Generate the compiled translations. All of this makes sense only if -rem the you're doing releases strictly -rem copy %QTDIR%\translations\qt_*.ts qtdir\translations -rem lrelease gpsbabel_de.ts -rem lrelease gpsbabel_es.ts -rem lrelease gpsbabel_fr.ts -rem lrelease gpsbabel_hu.ts -rem lrelease gpsbabel_it.ts -rem lrelease gpsbabelfe_de.ts -rem lrelease gpsbabelfe_es.ts -rem lrelease gpsbabelfe_fr.ts -rem lrelease gpsbabelfe_hu.ts -rem lrelease gpsbabelfe_it.ts -rem lrelease gpsbabelfe_ru.ts -rem for /f %%a in (dir /b *.ts) do lrelease %%a - -"c:\Program Files\Inno Setup 5\ISCC.exe" setup.iss - -rem cleanup -rd /q /s qtdir -rem del gpsbabel_*.qm -rem del gpsbabelfe_*.qm diff --git a/gui/map.cc b/gui/map.cc index 228959f21..e6e82fa60 100644 --- a/gui/map.cc +++ b/gui/map.cc @@ -76,8 +76,6 @@ Map::Map(QWidget* parent, stopWatch_.start(); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); manager_ = new QNetworkAccessManager(this); - connect(this,&QWebEngineView::loadFinished, - this,&Map::loadFinishedX); this->logTime("Start map constructor"); auto* mclicker = new MarkerClicker(this); @@ -85,6 +83,7 @@ Map::Map(QWidget* parent, this->page()->setWebChannel(channel); // Note: A current limitation is that objects must be registered before any client is initialized. channel->registerObject(QStringLiteral("mclicker"), mclicker); + connect(mclicker, &MarkerClicker::loadFinished, this, &Map::loadFinishedX); connect(mclicker, &MarkerClicker::markerClicked, this, &Map::markerClicked); connect(mclicker, &MarkerClicker::logTime, this, &Map::logTime); diff --git a/gui/map.h b/gui/map.h index 1ea743aab..6c2e69b7a 100644 --- a/gui/map.h +++ b/gui/map.h @@ -60,10 +60,15 @@ public slots: { emit logTime(s); } + void loadedX() + { + emit loadFinished(true); + } signals: void markerClicked(int t, int i); void logTime(const QString& s); + void loadFinished(bool b); }; diff --git a/gui/package_app b/gui/package_app index 4b1588bf9..55e7db779 100755 --- a/gui/package_app +++ b/gui/package_app @@ -7,17 +7,18 @@ function convert_qt_translations() { # Combine the Qt translation files we use into local qt_??.qm files. # -# It is recommended to combine Qts .qm files, this script does that for +# It is recommended to combine Qt's .qm files, this script does that for # linux and macos, windeployqt does this for windows. -# https://doc.qt.io/qt-5/linguist-programmers.html#deploying-translations +# https://doc.qt.io/qt-6/localization.html#deploy-translations # -# This script is created from the log of the windows build from windeployqt -# with Qt 5.12.1. +# This script is created from the log of the windows build +# with Qt 6.5.3 using windeployqt with the --verbose 2 option. # From the log you can see which translation files are used which depends on # which Qt modules we use. -# In our case these are qtbase_*.qm, qtdeclarative_*qm and qtserialport_*.qm. +# In our case these are qtbase_*.qm, qtdeclarative_*qm and qtserialport_*.qm, +# and qtwebengine_*.qm. # -# Note with Qt5 the Qt distributed qt_xx.qm files are metacatalogs, and just +# Note with Qt6 the Qt distributed qt_xx.qm files are metacatalogs, and just # copying or converting them won't copy the dependencies. if [ "${machine}" = "Mac" ]; then @@ -50,6 +51,7 @@ function convert_qt_translations() inputs+=("qtbase_${language}.qm") if [ -e "qtdeclarative_${language}.qm" ]; then inputs+=("qtdeclarative_${language}.qm"); fi if [ -e "qtserialport_${language}.qm" ]; then inputs+=("qtserialport_${language}.qm"); fi + if [ -e "qtwebengine_${language}.qm" ]; then inputs+=("qtwebengine_${language}.qm"); fi "${LCONVERT}" -o "${LANGDIR}/qt_${language}.qm" "${inputs[@]}" if [ "${machine}" = "Mac" ]; then diff --git a/gui/runmachine.cc b/gui/runmachine.cc index 80465a5c6..7633a06aa 100644 --- a/gui/runmachine.cc +++ b/gui/runmachine.cc @@ -19,13 +19,12 @@ #include "runmachine.h" -#include // for qDebug -#include // for QEventLoop -#include // for QNonConstOverload -#include // for QOverload, qOverload -#include // for QDialog +#include // for operator<<, QDebug +#include // for QEventLoop +#include // for QueuedConnection +#include // for qDebug -#include "appname.h" // for appName +#include "appname.h" // for appName QString RunMachine::decodeProcessError(QProcess::ProcessError err) @@ -64,8 +63,7 @@ RunMachine::RunMachine(QWidget* parent, std::nullopt, std::nullopt); }, Qt::QueuedConnection); - // TODO: Qt6 combined the obsolete overloaded signal QProcess::finished(int exitCode) - connect(process_, qOverload(&QProcess::finished), + connect(process_, &QProcess::finished, this, [this](int exitCode, QProcess::ExitStatus exitStatus) { execute(processFinished, std::nullopt, diff --git a/gui/runmachine.h b/gui/runmachine.h index ff3104b52..a5330f29e 100644 --- a/gui/runmachine.h +++ b/gui/runmachine.h @@ -20,15 +20,16 @@ #ifndef RUNMACHINE_H #define RUNMACHINE_H -#include // for QObject -#include // for QProcess, QProcess::ExitStatus, QProcess::ProcessError, qt_getEnumName -#include // for QString -#include // for QStringList -#include // for QWidget +#include // for QList +#include // for Q_ENUM, Q_OBJECT, Q_SIGNALS +#include // for QProcess, QProcess::ProcessError, QProcess::ExitStatus +#include // for QString +#include // for QStringList +#include // for QWidget -#include // for optional, nullopt +#include // for optional -#include "processwait.h" // for ProcessWaitDialog +#include "processwait.h" // for ProcessWaitDialog class RunMachine : public QWidget diff --git a/html.cc b/html.cc index 54ca38428..e9971ed26 100644 --- a/html.cc +++ b/html.cc @@ -33,6 +33,7 @@ #include "formspec.h" // for FormatSpecificDataList, kFsGpx #include "geocache.h" // for Geocache, Geocache::UtfString #include "jeeps/gpsmath.h" // for GPS_Math_WGS84_To_UTM_EN +#include "mkshort.h" // for MakeShort #include "src/core/datetime.h" // for DateTime #include "src/core/textstream.h" // for TextStream #include "src/core/xmltag.h" // for xml_findfirst, xml_tag, xml_attribute, fs_xml, xml_findnext @@ -45,7 +46,7 @@ HtmlFormat::wr_init(const QString& fname) { file_out = new gpsbabel::TextStream; file_out->open(fname, QIODevice::WriteOnly, MYNAME); - mkshort_handle = mkshort_new_handle(); + mkshort_handle = new MakeShort; } void @@ -54,7 +55,8 @@ HtmlFormat::wr_deinit() file_out->close(); delete file_out; file_out = nullptr; - mkshort_del_handle(&mkshort_handle); + delete mkshort_handle; + mkshort_handle = nullptr; } QString HtmlFormat::create_id(int sequence_number) @@ -78,7 +80,7 @@ HtmlFormat::html_disp(const Waypoint* wpt) const *file_out << "

\n"; *file_out << " \n"; - QString sn = global_opts.synthesize_shortnames ? mkshort_from_wpt(mkshort_handle, wpt) : wpt->shortname; + QString sn = global_opts.synthesize_shortnames ? mkshort_handle->mkshort_from_wpt(wpt) : wpt->shortname; *file_out << " \n"; *file_out << " + +
\n"; *file_out << "

" << sn << " - "; @@ -166,7 +168,7 @@ HtmlFormat::html_disp(const Waypoint* wpt) const logpart = curlog->xml_findfirst(u"groundspeak:date"); if (logpart) { - gpsbabel::DateTime logtime = xml_parse_time(logpart->cdata).toLocalTime(); + gpsbabel::DateTime logtime = xml_parse_time(logpart->cdata).toUTC(); *file_out << "" << logtime.toString(u"yyyy-MM-dd") << "
\n"; } @@ -216,7 +218,7 @@ HtmlFormat::html_index(const Waypoint* wpt) const void HtmlFormat::write() { - setshort_length(mkshort_handle, 6); + mkshort_handle->set_length(6); *file_out << "\n"; *file_out << "\n"; @@ -226,12 +228,12 @@ HtmlFormat::write() // Don't write this line when running test suite. Actually, we should // probably not write this line at all... if (!gpsbabel_testmode()) { - *file_out << " \n"; } *file_out << " GPSBabel HTML Output\n"; if (stylesheet) { - *file_out << " \n"; } else { *file_out << " - - Heart Rate - Cadence - - Power + + Depth + + + Heart Rate Temperature - - Depth + + Power + + + Satellites @@ -280,6 +283,25 @@ 402.7 + + 6 + 8 + 6 + 3 + 12 + 11 + 3 + 4 + 10 + 4 + 10 + 9 + 8 + 9 + 2 + 3 + 5 + diff --git a/reference/route/bend-expected.gpx b/reference/route/bend-expected.gpx index 78deb90f1..3b6ed9f78 100644 --- a/reference/route/bend-expected.gpx +++ b/reference/route/bend-expected.gpx @@ -1,7 +1,7 @@ - + santander Generated from track santander @@ -9,15 +9,15 @@ 34.733 RPT001 - + 34.252 RPT002 - + 34.252 RPT002 - + 31.369 RPT003 @@ -25,71 +25,71 @@ 31.369 RPT003 - + 28.965 RPT004 - + 24.159 RPT005 - + 24.159 RPT005 - + 22.236 RPT006 - + 22.236 RPT006 - + 29.927 RPT007 - + 29.927 RPT007 - + 37.617 RPT008 - + 37.617 RPT008 - + 56.843 RPT009 - + 56.843 RPT009 - + 52.998 RPT010 - + 52.998 RPT010 - + 52.998 RPT011 - + 52.998 RPT011 - + 43.385 RPT012 - + 43.385 RPT012 @@ -97,31 +97,31 @@ 29.927 RPT013 - + 29.927 RPT013 - + 20.794 RPT014 - + 20.794 RPT014 - + 19.833 RPT015 - + 19.833 RPT015 - + 15.507 RPT016 - + 15.507 RPT016 @@ -129,23 +129,23 @@ 15.026 RPT017 - + 15.026 RPT017 - + 11.662 RPT018 - + 11.662 RPT018 - + 11.181 RPT019 - + 11.181 RPT019 @@ -153,83 +153,83 @@ 11.662 RPT020 - + 11.662 RPT020 - + 7.816 RPT021 - + 7.816 RPT021 - + 14.546 RPT022 - + 14.546 RPT022 - + 17.430 RPT023 - + 17.430 RPT023 - + 16.468 RPT024 - + 16.468 RPT024 - + 19.352 RPT025 - + 19.352 RPT025 - + 17.910 RPT026 - + 17.910 RPT026 - + 26.081 RPT027 - + 26.081 RPT027 - + 27.523 RPT028 - + 27.523 RPT028 - + 28.965 RPT029 - + 28.965 RPT029 - + 36.175 RPT030 @@ -241,103 +241,103 @@ 40.501 RPT031 - + 40.501 RPT031 - + 51.075 RPT032 - + 51.075 RPT032 - + 49.153 RPT033 - + 49.153 RPT033 - + 52.037 RPT034 - + 52.037 RPT034 - + 56.843 RPT035 - + 56.843 RPT035 - + 59.246 RPT036 - + 59.246 RPT036 - + 58.766 RPT037 - + 58.766 RPT037 - + 62.611 RPT038 - + 62.611 RPT038 - + 65.014 RPT039 - + 65.014 RPT039 - + 65.014 RPT040 - + 65.014 RPT040 - + 67.418 RPT041 - + 67.418 RPT041 - + 62.130 RPT042 - + 62.130 RPT042 - + 64.534 RPT043 - + 64.534 RPT043 @@ -345,27 +345,27 @@ 66.456 RPT044 - + 66.456 RPT044 - + 53.479 RPT045 - + 53.479 RPT045 - + 46.750 RPT046 - + 46.750 RPT046 - + 56.843 RPT047 @@ -373,11 +373,11 @@ 56.843 RPT047 - + 58.766 RPT048 - + 62.611 RPT049 @@ -385,11 +385,11 @@ 62.611 RPT049 - + 60.688 RPT050 - + 29.927 RPT051 @@ -401,51 +401,51 @@ 29.446 RPT052 - + 29.446 RPT052 - + 12.623 RPT053 - + 12.623 RPT053 - + 35.214 RPT054 - + 35.214 RPT054 - + 26.081 RPT055 - + 35.694 RPT056 - + 36.656 RPT057 - + 36.656 RPT057 - + 38.578 RPT058 - + 38.578 RPT058 - + 32.811 RPT059 @@ -453,19 +453,19 @@ 32.811 RPT059 - + 32.811 RPT060 - + 32.811 RPT060 - + 31.369 RPT061 - + 31.369 RPT061 @@ -473,51 +473,51 @@ 29.927 RPT062 - + 29.927 RPT062 - + 25.120 RPT063 - + 25.120 RPT063 - + 9.258 RPT064 - + 9.258 RPT064 - + 6.374 RPT065 - + 6.374 RPT065 - + 5.413 RPT066 - + 5.413 RPT066 - + 5.894 RPT067 - + 5.894 RPT067 - + 7.816 RPT068 @@ -529,43 +529,43 @@ 6.374 RPT069 - + 6.374 RPT069 - + 2.529 RPT070 - + 2.529 RPT070 - + 2.529 RPT071 - + 2.529 RPT071 - + 3.971 RPT072 - + 3.971 RPT072 - + 1.568 RPT073 - + 1.568 RPT073 - + 0.126 RPT074 @@ -573,35 +573,35 @@ 0.126 RPT074 - + 2.049 RPT075 - + 2.049 RPT075 - + 0.126 RPT076 - + 0.126 RPT076 - + 2.049 RPT077 - + 2.049 RPT077 - + 3.490 RPT078 - + 3.971 RPT079 @@ -609,19 +609,19 @@ 3.971 RPT079 - + 4.932 RPT080 - + 2.049 RPT081 - + 2.049 RPT081 - + 0.607 RPT082 @@ -629,19 +629,19 @@ 0.607 RPT082 - + 2.529 RPT083 - + 1.568 RPT084 - + 1.568 RPT084 - + 2.529 RPT085 @@ -653,15 +653,15 @@ 3.971 RPT086 - + 5.413 RPT087 - + 5.413 RPT087 - + 1.087 RPT088 @@ -669,27 +669,27 @@ 1.087 RPT088 - + 3.971 RPT089 - + 12.142 RPT090 - + 12.142 RPT090 - + 8.297 RPT091 - + 8.297 RPT091 - + -0.835 RPT092 @@ -701,19 +701,19 @@ 5.413 RPT093 - + 5.413 RPT093 - + 25.120 RPT094 - + 25.120 RPT094 - + 25.120 RPT095 @@ -721,43 +721,43 @@ 25.120 RPT095 - + 23.197 RPT096 - + 26.562 RPT097 - + 26.562 RPT097 - + 26.081 RPT098 - + 26.081 RPT098 - + 26.562 RPT099 - + 26.562 RPT099 - + 26.081 RPT100 - + 26.081 RPT100 - + 30.888 RPT101 @@ -769,11 +769,11 @@ 25.601 RPT102 - + 25.601 RPT102 - + 20.794 RPT103 @@ -785,43 +785,43 @@ 17.430 RPT104 - + 17.430 RPT104 - + 6.374 RPT105 - + 6.374 RPT105 - + 4.932 RPT106 - + 4.932 RPT106 - + 2.529 RPT107 - + 2.529 RPT107 - + 15.507 RPT108 - + 15.507 RPT108 - + 19.833 RPT109 @@ -829,11 +829,11 @@ 19.833 RPT109 - + 20.313 RPT110 - + 11.181 RPT111 @@ -841,63 +841,63 @@ 11.181 RPT111 - + 2.049 RPT112 - + 2.049 RPT112 - + 6.374 RPT113 - + 6.374 RPT113 - + 7.336 RPT114 - + 7.336 RPT114 - + 11.662 RPT115 - + 11.662 RPT115 - + 12.142 RPT116 - + 12.142 RPT116 - + 15.026 RPT117 - + 15.026 RPT117 - + 13.584 RPT118 - + 13.584 RPT118 - + 10.220 RPT119 @@ -905,27 +905,27 @@ 10.220 RPT119 - + 9.258 RPT120 - + 14.065 RPT121 - + 14.065 RPT121 - + 11.662 RPT122 - + 11.662 RPT122 - + 6.855 RPT123 @@ -933,139 +933,139 @@ 6.855 RPT123 - + 4.932 RPT124 - + 3.971 RPT125 - + 3.971 RPT125 - + 5.894 RPT126 - + 5.894 RPT126 - + 5.413 RPT127 - + 5.413 RPT127 - + 22.717 RPT128 - + 22.717 RPT128 - + 38.578 RPT129 - + 38.578 RPT129 - + 58.766 RPT130 - + 58.766 RPT130 - + 66.456 RPT131 - + 66.456 RPT131 - + 62.611 RPT132 - + 62.611 RPT132 - + 64.053 RPT133 - + 64.053 RPT133 - + 65.976 RPT134 - + 65.976 RPT134 - + 66.456 RPT135 - + 66.456 RPT135 - + 61.169 RPT136 - + 61.169 RPT136 - + 62.611 RPT137 - + 62.611 RPT137 - + 61.650 RPT138 - + 61.650 RPT138 - + 46.269 RPT139 - + 46.269 RPT139 - + 36.175 RPT140 - + 36.175 RPT140 - + 18.391 RPT141 @@ -1077,27 +1077,27 @@ 10.220 RPT142 - + 18.391 RPT143 - + 18.391 RPT143 - + 37.136 RPT144 - + 37.136 RPT144 - + 31.369 RPT145 - + 31.369 RPT145 @@ -1105,19 +1105,19 @@ 4.932 RPT146 - + 13.584 RPT147 - + 13.584 RPT147 - + 24.639 RPT148 - + 24.639 RPT148 @@ -1125,91 +1125,91 @@ 27.523 RPT149 - + 27.523 RPT149 - + 22.717 RPT150 - + 22.717 RPT150 - + 45.307 RPT151 - + 45.307 RPT151 - + 26.562 RPT152 - + 26.562 RPT152 - + 34.733 RPT153 - + 34.733 RPT153 - + 26.562 RPT154 - + 26.562 RPT154 - + 34.252 RPT155 - + 34.252 RPT155 - + 28.965 RPT156 - + 28.965 RPT156 - + 24.159 RPT157 - + 24.159 RPT157 - + 23.197 RPT158 - + 23.197 RPT158 - + 21.755 RPT159 - + 21.755 RPT160 - + 23.197 RPT161 @@ -1221,63 +1221,63 @@ 9.739 RPT162 - + 9.739 RPT162 - + 11.181 RPT163 - + 11.181 RPT163 - + 12.623 RPT164 - + 12.623 RPT164 - + 22.236 RPT165 - + 22.236 RPT165 - + 38.098 RPT166 - + 38.098 RPT166 - + 24.639 RPT167 - + 24.639 RPT167 - + 16.949 RPT168 - + 16.949 RPT168 - + 19.833 RPT169 - + 19.833 RPT169 @@ -1285,31 +1285,31 @@ 3.010 RPT170 - + 18.871 RPT171 - + 18.871 RPT171 - + 15.507 RPT172 - + 15.507 RPT172 - + 23.678 RPT173 - + 23.678 RPT173 - + 36.656 RPT174 @@ -1317,19 +1317,19 @@ 36.656 RPT174 - + 39.540 RPT175 - + 40.501 RPT176 - + 40.501 RPT176 - + 46.269 RPT177 @@ -1337,15 +1337,15 @@ 46.269 RPT177 - + 55.709 RPT178 - + 55.709 RPT178 - + 70.709 RPT179 @@ -1353,11 +1353,11 @@ 70.709 RPT179 - + 75.709 RPT180 - + 90.267 RPT181 @@ -1365,55 +1365,55 @@ 90.267 RPT181 - + 95.964 RPT182 - + 95.964 RPT182 - + 100.102 RPT183 - + 100.102 RPT183 - + 93.373 RPT184 - + 93.373 RPT184 - + 90.970 RPT185 - + 90.970 RPT185 - + 88.086 RPT186 - + 88.086 RPT186 - + 87.605 RPT187 - + 87.605 RPT187 - + 102.986 RPT188 @@ -1425,15 +1425,15 @@ 126.058 RPT189 - + 126.058 RPT189 - + 144.803 RPT190 - + 144.803 RPT190 @@ -1441,11 +1441,11 @@ 180.372 RPT191 - + 180.372 RPT191 - + 191.427 RPT192 @@ -1453,15 +1453,15 @@ 191.427 RPT192 - + 197.195 RPT193 - + 210.653 RPT194 - + 210.653 RPT194 @@ -1469,39 +1469,39 @@ 231.802 RPT195 - + 208.730 RPT196 - + 208.730 RPT196 - + 195.272 RPT197 - + 195.272 RPT197 - + 187.101 RPT198 - + 187.101 RPT198 - + 155.378 RPT199 - + 155.378 RPT199 - + 148.168 RPT200 @@ -1513,27 +1513,27 @@ 183.736 RPT201 - + 183.736 RPT201 - + 200.079 RPT202 - + 200.079 RPT202 - + 208.730 RPT203 - + 208.730 RPT203 - + 221.228 RPT204 @@ -1541,11 +1541,11 @@ 221.228 RPT204 - + 235.166 RPT205 - + 235.166 RPT205 @@ -1553,23 +1553,23 @@ 226.034 RPT206 - + 226.034 RPT206 - + 201.521 RPT207 - + 201.521 RPT207 - + 188.543 RPT208 - + 188.543 RPT208 @@ -1577,183 +1577,183 @@ 144.803 RPT209 - + 144.803 RPT209 - + 141.919 RPT210 - + 141.919 RPT210 - + 136.151 RPT211 - + 136.151 RPT211 - + 110.196 RPT212 - + 110.196 RPT212 - + 86.163 RPT213 - + 86.163 RPT213 - + 75.589 RPT214 - + 75.589 RPT214 - + 71.263 RPT215 - + 71.263 RPT215 - + 66.937 RPT216 - + 66.937 RPT216 - + 63.092 RPT217 - + 63.092 RPT217 - + 61.650 RPT218 - + 61.650 RPT218 - + 59.727 RPT219 - + 59.727 RPT219 - + 55.882 RPT220 - + 55.882 RPT220 - + 53.479 RPT221 - + 53.479 RPT221 - + 55.401 RPT222 - + 55.401 RPT222 - + 52.037 RPT223 - + 52.037 RPT223 - + 49.153 RPT224 - + 49.153 RPT224 - + 46.750 RPT225 - + 46.750 RPT225 - + 48.672 RPT226 - + 48.672 RPT226 - + 44.827 RPT227 - + 44.827 RPT227 - + 44.827 RPT228 - + 44.827 RPT228 - + 44.346 RPT229 - + 44.346 RPT229 - + 45.307 RPT230 - + 45.307 RPT230 - + 42.904 RPT231 - + 42.904 RPT231 diff --git a/reference/route/bendgc-expected.gpx b/reference/route/bendgc-expected.gpx new file mode 100644 index 000000000..e6b35637d --- /dev/null +++ b/reference/route/bendgc-expected.gpx @@ -0,0 +1,71 @@ + + + + + + RPT001 + <table> +<tr><td>Longitude: 140.615728</td></tr> +<tr><td>Latitude: 35.752604</td></tr> +</table> + <table> +<tr><td>Longitude: 140.615728</td></tr> +<tr><td>Latitude: 35.752604</td></tr> +</table> + + + RPT002 + <table> +<tr><td>Longitude: 166.492918</td></tr> +<tr><td>Latitude: 42.992831</td></tr> +</table> + <table> +<tr><td>Longitude: 166.492918</td></tr> +<tr><td>Latitude: 42.992831</td></tr> +</table> + + + RPT003 + <table> +<tr><td>Longitude: -157.876012</td></tr> +<tr><td>Latitude: 46.203079</td></tr> +</table> + <table> +<tr><td>Longitude: -157.876012</td></tr> +<tr><td>Latitude: 46.203079</td></tr> +</table> + + + RPT004 + <table> +<tr><td>Longitude: -127.622914</td></tr> +<tr><td>Latitude: 42.925678</td></tr> +</table> + <table> +<tr><td>Longitude: -127.622914</td></tr> +<tr><td>Latitude: 42.925678</td></tr> +</table> + + + Path + Generated from track Path + + RPT001 + + + RPT002 + + + RPT002 + + + RPT003 + + + RPT003 + + + RPT004 + + + diff --git a/reference/route/bendgc-input.kml b/reference/route/bendgc-input.kml new file mode 100644 index 000000000..a5de804e5 --- /dev/null +++ b/reference/route/bendgc-input.kml @@ -0,0 +1,169 @@ + + + + GPS device + Created Mon Aug 12 01:46:31 2024 GMT + + 186.496407 + 40.977841 + 9571750.976741 + + + + + + + + normal + #route_n + + + highlight + #route_h + + + + + + + + + normal + #waypoint_n + + + highlight + #waypoint_h + + + + + Routes + + + Points + + RPT001 + + +

Longitude: 140.615728
Latitude: 35.752604
+]]> + + 140.615728 + 35.752604 + 66 + + #route + + 140.615728,35.752604 + + + + RPT002 + + +Longitude: 166.492918 +Latitude: 42.992831 + +]]> + + 166.492918 + 42.992831 + 66 + + #route + + 166.492918,42.992831 + + + + RPT003 + + +Longitude: -157.876012 +Latitude: 46.203079 + +]]> + + -157.876012 + 46.203079 + 66 + + #route + + -157.876012,46.203079 + + + + RPT004 + + +Longitude: -127.622914 +Latitude: 42.925678 + +]]> + + -127.622914 + 42.925678 + 66 + + #route + + -127.622914,42.925678 + + + + + Path + #lineStyle + + 1 + +140.615728,35.752604 +166.492918,42.992831 +-157.876012,46.203079 +-127.622914,42.925678 + + + + + + + diff --git a/reference/route/humminbird_gpsbabel.hwr b/reference/route/humminbird_gpsbabel.hwr new file mode 100644 index 000000000..f2f5a2bba Binary files /dev/null and b/reference/route/humminbird_gpsbabel.hwr differ diff --git a/reference/simplify_error_length.gpx b/reference/simplify_error_length.gpx index 48a4357ab..2ba09ce7a 100644 --- a/reference/simplify_error_length.gpx +++ b/reference/simplify_error_length.gpx @@ -1,7 +1,7 @@ - + LAP001 LAP001 @@ -34,6 +34,16 @@ 3.088000 + + 510.200 + + 5.925000 + + + 510.200 + + 6.637000 + 511.400 @@ -151,6 +161,11 @@ 6.169000 + + 519.200 + + 6.248000 + 520.400 @@ -251,11 +266,6 @@ 7.546000 - - 540.800 - - 8.935000 - 538.600 @@ -281,6 +291,11 @@ 4.329000 + + 536.600 + + 5.039000 + 536.600 @@ -306,6 +321,11 @@ 8.963000 + + 538.600 + + 8.420000 + 538.600 @@ -336,10 +356,10 @@ 7.927000 - + 536.400 - - 8.233000 + + 8.272000 536.400 @@ -371,11 +391,6 @@ 8.439000 - - 538.800 - - 8.476000 - 538.800 @@ -516,11 +531,6 @@ 5.373000 - - 541.600 - - 6.961000 - 537.200 @@ -646,16 +656,6 @@ 6.347000 - - 533.600 - - 6.408000 - - - 533.600 - - 6.192000 - 538.400 @@ -720,6 +720,16 @@ 7.587000 + + 542.000 + + 6.804000 + + + 542.000 + + 6.545000 + 543.200 @@ -755,10 +765,10 @@ 5.492000 - - 543.000 - - 7.660000 + + 544.000 + + 7.097000 542.200 @@ -815,6 +825,11 @@ 4.790000 + + 521.400 + + 4.333000 + 520.000 @@ -850,6 +865,11 @@ 5.026000 + + 520.000 + + 6.505000 + 520.000 @@ -950,6 +970,16 @@ 8.019000 + + 526.400 + + 1.765000 + + + 526.400 + + 1.335000 + @@ -1068,16 +1098,6 @@ 7.009000 - - 535.400 - - 6.641000 - - - 539.400 - - 6.555000 - 542.400 @@ -1088,6 +1108,11 @@ 5.426000 + + 543.800 + + 5.012000 + 548.000 @@ -1118,21 +1143,6 @@ 11.715000 - - 540.800 - - 10.787000 - - - 540.000 - - 10.409000 - - - 539.000 - - 10.124000 - 538.600 @@ -1198,11 +1208,6 @@ 10.073000 - - 536.400 - - 10.149000 - 535.400 @@ -1223,11 +1228,6 @@ 7.019000 - - 532.000 - - 7.612000 - 532.000 @@ -1313,11 +1313,6 @@ 9.152000 - - 529.600 - - 9.009000 - 529.600 @@ -1348,6 +1343,16 @@ 6.158000 + + 527.600 + + 6.444000 + + + 527.600 + + 6.139000 + 527.600 @@ -1383,6 +1388,11 @@ 6.457000 + + 529.600 + + 7.202000 + 529.600 @@ -1403,11 +1413,6 @@ 8.735000 - - 528.200 - - 9.047000 - 527.800 @@ -1448,6 +1453,11 @@ 6.894000 + + 521.000 + + 8.741000 + 521.000 @@ -1478,11 +1488,6 @@ 6.483000 - - 521.000 - - 8.439000 - 521.000 @@ -1508,6 +1513,11 @@ 6.395000 + + 525.200 + + 7.643000 + 525.200 @@ -1553,26 +1563,11 @@ 5.394000 - - 533.600 - - 6.307000 - - - 536.400 - - 5.016000 - 539.400 4.804000 - - 540.200 - - 4.605000 - 540.200 @@ -1583,6 +1578,16 @@ 4.724000 + + 542.400 + + 4.880000 + + + 542.400 + + 5.821000 + 542.400 @@ -1593,11 +1598,6 @@ 6.516000 - - 542.400 - - 6.389000 - 542.400 diff --git a/reference/track/27GLQKF3.igc b/reference/track/27GLQKF3.igc new file mode 100755 index 000000000..ccff282e0 --- /dev/null +++ b/reference/track/27GLQKF3.igc @@ -0,0 +1,1108 @@ +ALXNQKFFLIGHT:3 +HFDTE160722 +HFFXA015 +HFPLTPILOTINCHARGE:CHRIS RAZL +HFCM2CREW2: +HFGTYGLIDERTYPE:LS 4 +HFGIDGLIDERID: +HFDTM100GPSDATUM:WGS-1984 +HFRFWFIRMWAREVERSION:1.60 +HFRHWHARDWAREVERSION:1.00 +HFFTYFRTYPE:LX Eos +HFGPS:uBLOX-LEA-6S,50ch,max50000m +HFPRSPRESSALTSENSOR:INTERSEMA,MS5607,max15000m +HFCIDCOMPETITIONID: +HFCCLCOMPETITIONCLASS: +I053638FXA3940SIU4143GSP4446ENL4749GFO +C030722195242160722000103 +C0000000N00000000ETAKEOFF +C4350100N08026199W05Arthur +C4309816N08124633W38Lucan +C4409417N08103782W30Hanove +C4352482N08017200W27Grand +C4350100N08026199W05Arthur +C4350100N08026199W05ARTHUR AP +B1941314350420N08026585WA004380046300712000018009 +B1941464350420N08026585WA004380046300712000018009 +B1942014350420N08026585WA004380046300712000018009 +B1942164350396N08026557WA004380046300712046999009 +B1942224350352N08026500WA004390046300712076390008 +B1942274350306N08026434WA004390046400712096179009 +B1942324350251N08026354WA004420046600712112238013 +B1942374350192N08026271WA004600048400712111263009 +B1942424350136N08026187WA004760050300712108262010 +B1942474350082N08026107WA004980052400711101285009 +B1942524350030N08026030WA005150054300711103283009 +B1942574349980N08025949WA005270055700711101162009 +B1943024349923N08025884WA005430057400711097150009 +B1943074349856N08025846WA005510058400811100141009 +B1943134349782N08025846WA005580059000711097161009 +B1943174349712N08025868WA005690060100711095152009 +B1943224349649N08025918WA005720061100711099255010 +B1943274349599N08025998WA005870062600711103192009 +B1943324349567N08026097WA005980063800711102242009 +B1943384349540N08026208WA006130065600711103191009 +B1943424349515N08026299WA006300067200711103240008 +B1943474349501N08026403WA006450068700711101245009 +B1943524349515N08026509WA006530069700711107196009 +B1943584349558N08026605WA006580070200711112222011 +B1944034349627N08026682WA006640070900711122237010 +B1944084349718N08026718WA006740071900711131257011 +B1944134349813N08026706WA006930073800711126237009 +B1944184349901N08026655WA007010074800711128129010 +B1944234349973N08026553WA007070075500711122157010 +B1944284350010N08026440WA007160076500711119189009 +B1944334350021N08026316WA007230077300711121280009 +B1944384349996N08026199WA007310078200711115270008 +B1944434349943N08026107WA007380079000711112203010 +B1944484349872N08026049WA007470079900711108246010 +B1944534349794N08026030WA007600081100711103231009 +B1944584349719N08026056WA007700082000711103257010 +B1945034349657N08026121WA007840083400711104307011 +B1945084349617N08026209WA008100085600811098199008 +B1945134349589N08026304WA008220086900711097147009 +B1945184349565N08026399WA008320087900711095149008 +B1945234349542N08026494WA008420088800711097182010 +B1945284349519N08026593WA008500089500711102238010 +B1945334349493N08026691WA008700091700711099235009 +B1945384349452N08026776WA008870093600711100342008 +B1945434349386N08026827WA009050095200711100369010 +B1945484349311N08026830WA009220097000711102233009 +B1945534349237N08026785WA009240097200711112294009 +B1945584349183N08026694WA009290097800811117268009 +B1946034349155N08026573WA009380098600711127344010 +B1946084349161N08026441WA009530100000711129398009 +B1946134349202N08026300WA009620101100711136396010 +B1946184349264N08026202WA009730102400711140296010 +B1946234349333N08026094WA009920104500711138264008 +B1946284349379N08025967WA010040105700711136195010 +B1946334349391N08025827WA010140106800711133267010 +B1946384349377N08025693WA010270108200711128314010 +B1946434349334N08025565WA010420109900711121206010 +B1946484349269N08025481WA010580111600711117267009 +B1946534349188N08025430WA010670112400711118235010 +B1946584349101N08025426WA010770113500811115326008 +B1947034349022N08025464WA010960115500711110230007 +B1947084348962N08025540WA011020116000711109278011 +B1947134348924N08025644WA011100116800711114273010 +B1947184348912N08025764WA011200117700711119263011 +F1947180520021107292330131815 +B1947234348922N08025887WA011360119400711118263009 +B1947284348938N08026009WA011540121300711119332008 +B1947334348931N08026129WA011740123300711116296008 +B1947394348897N08026238WA011940125200711113271010 +B1947444348831N08026313WA012170127600711115370010 +B1947494348748N08026331WA012360129600711110348010 +B1947534348669N08026297WA012620132300711109321007 +B1947594348605N08026222WA012880134900711114273010 +B1948034348562N08026117WA013160137500711121294008 +B1948094348561N08025974WA013270139100711131322011 +B1948144348597N08025845WA013420141000711126279015 +B1948194348558N08025747WA013470141400711108278009 +B1948244348498N08025679WA013480141700711097159008 +B1948294348437N08025624WA013460141200811095062009 +B1948344348398N08025546WA013410140700711093051010 +B1948394348434N08025472WA013360140200711088030011 +B1948444348496N08025466WA013330140000711082032010 +B1948494348548N08025513WA013300139500711083029009 +B1948544348578N08025591WA013280139400711087061009 +B1948594348588N08025681WA013280139300711088037009 +B1949044348586N08025774WA013200138400711090047010 +B1949094348574N08025865WA013190138300711088039009 +B1949144348559N08025955WA013250138900711089032008 +B1949194348538N08026045WA013360140000711091043010 +B1949244348484N08026084WA013490141500711079057011 +B1949294348440N08026034WA013580142500711082061011 +B1949344348456N08025951WA013730144000711088056010 +B1949394348514N08025915WA013830145100711087048010 +B1949444348572N08025952WA013900145900711085041010 +B1949494348585N08026034WA014000147000711081045010 +B1949544348540N08026098WA014080147900711082064010 +B1949594348482N08026093WA014230149400711077067010 +B1950044348458N08026021WA014370150800811081047011 +B1950094348494N08025956WA014540152700711084046010 +B1950144348557N08025961WA014590153300711087038011 +B1950194348589N08026036WA014710154500711085050010 +B1950244348564N08026107WA014850156000711074047009 +B1950294348509N08026117WA014900156500711079041010 +B1950344348468N08026058WA015030157700811081050011 +B1950404348477N08025976WA015220159600711083049010 +B1950454348530N08025929WA015350161200711088044009 +B1950504348597N08025960WA015400161700711089078011 +B1950554348618N08026041WA015550163100711083049010 +B1951004348596N08026115WA015670164300711086056010 +B1951054348545N08026173WA015820165900711078053010 +B1951104348492N08026143WA015910167000711079047010 +B1951154348480N08026062WA015970167600711088044011 +B1951204348522N08025991WA016130169300711091054009 +B1951254348588N08025994WA016320171200711091059010 +B1951304348610N08026077WA016430172400711090049010 +B1951354348564N08026137WA016560173800711084071010 +B1951404348512N08026102WA016660175000711080045010 +B1951454348515N08026016WA016700175300711097041012 +B1951504348582N08025977WA016890177300711098052009 +B1951554348648N08026009WA017030178700711097061010 +B1952004348664N08026101WA017170180000711092065010 +B1952054348617N08026162WA017290181300711085054010 +B1952104348559N08026139WA017380182200711087028010 +B1952154348546N08026040WA017440182900711094026011 +B1952204348596N08025971WA017610184700711097026010 +B1952254348664N08025951WA017770186200711093025012 +B1952304348701N08026024WA017860187200711087026011 +B1952354348670N08026097WA017970188300711085026010 +B1952404348611N08026090WA018090189600711080026010 +B1952454348589N08026009WA018150190000711092025011 +B1952504348632N08025936WA018330191900711090025010 +B1952554348694N08025950WA018480193500711086024010 +B1953004348716N08026029WA018560194300711084026011 +B1953054348677N08026092WA018690195500711081026011 +B1953104348622N08026083WA018810196800711076025009 +B1953154348591N08026011WA018920197800811088025010 +B1953204348606N08025922WA019060199300711091025009 +B1953254348663N08025876WA019100200100711089044010 +B1953304348725N08025896WA019120200200711085058009 +B1953354348765N08025967WA019120200000711090072010 +B1953404348752N08026056WA019190200700711089069010 +B1953454348694N08026095WA019310201900711089040010 +B1953504348633N08026057WA019410202900711095080011 +B1953554348617N08025965WA019610205100711093046009 +B1954004348658N08025890WA019730206500711091063009 +B1954054348721N08025879WA019800207200711085057010 +B1954114348771N08025928WA019810207100711083046010 +B1954164348798N08026007WA019890207900711083054009 +B1954214348803N08026091WA020020209200811077042010 +B1954264348762N08026144WA020040209300711083037011 +B1954314348702N08026120WA020000209000711088046010 +B1954364348678N08026036WA020070209800811093058010 +B1954414348702N08025949WA020240211700711090042010 +B1954464348765N08025930WA020290212200711089059011 +B1954514348808N08025998WA020390213300711079059010 +B1954564348786N08026069WA020490214400711075091010 +B1955014348733N08026084WA020550214900711075062009 +B1955064348685N08026030WA020560215000711093047012 +B1955114348698N08025947WA020760217200711083071009 +B1955164348759N08025917WA020750217000711096118011 +B1955214348814N08025972WA020850218300710089069010 +B1955264348805N08026054WA021000219800711079062010 +B1955314348753N08026086WA021040220000711081045011 +B1955364348702N08026041WA021130221100811087048011 +B1955414348708N08025951WA021250222300711095046010 +B1955464348773N08025915WA021310223000711096059011 +B1955514348826N08025969WA021400223900711088047011 +B1955564348811N08026047WA021520225300711077048009 +B1956014348756N08026058WA021550225400711084043013 +B1956064348720N08025988WA021720227100711086059010 +B1956114348751N08025909WA021760227700711096059010 +B1956164348820N08025896WA021840228400711094061010 +B1956214348865N08025960WA021930229200711085044011 +B1956264348841N08026034WA022000230000711078051009 +B1956314348784N08026040WA022020230000711087053013 +B1956364348770N08025959WA022140231500711085045009 +B1956414348819N08025902WA022130231200711093037011 +B1956464348881N08025939WA022130231400711090068010 +B1956514348901N08026026WA022180231900711088030009 +B1956564348891N08026115WA022160231600811085042008 +B1957014348857N08026188WA022100230700711084049011 +B1957064348798N08026193WA022060230400711086059011 +B1957114348753N08026129WA022160231500711085045008 +B1957164348727N08026047WA022130231100811093059010 +B1957214348755N08025958WA022110231000711100048010 +B1957264348825N08025938WA022200232000711094057010 +B1957314348868N08026006WA022220232200711090056011 +B1957364348843N08026086WA022250232400711087056012 +B1957414348782N08026083WA022340233500711085065011 +B1957464348758N08026003WA022360233700711086040010 +B1957514348789N08025925WA022270232800711099043012 +B1957564348866N08025927WA022260232900711103034008 +B1958014348945N08025953WA022220232100711111042009 +B1958064349029N08025984WA022190231500711120039009 +B1958114349119N08026019WA022190231400711126040010 +B1958164349206N08026068WA022310232200711120053015 +B1958214349206N08026158WA022470234300711082068010 +B1958264349150N08026166WA022430234100711080039008 +B1958314349093N08026114WA022210231800711104089010 +B1958364349037N08026024WA022130230700711117043009 +B1958414348987N08025922WA022110230500711120040009 +B1958464348943N08025810WA022080230100711124040009 +B1958514348903N08025691WA022030229700710126042009 +B1958564348869N08025568WA021970229200710128040010 +B1959014348838N08025441WA021900228400711130042008 +B1959064348805N08025312WA021930228600711130048012 +B1959114348774N08025212WA022220232200711087033005 +B1959164348747N08025125WA022140231100711097063009 +B1959214348713N08025034WA022120231000711099054008 +B1959264348682N08024934WA022010230000710113037009 +B1959314348646N08024821WA021910228700711123037009 +B1959364348603N08024705WA021820227800711127042009 +B1959414348562N08024584WA021730226900711130038009 +B1959464348520N08024460WA021620225800711135042009 +B1959514348469N08024336WA021530224600711139050009 +B1959564348413N08024214WA021480224000711138048008 +B2000014348359N08024092WA021430223500711135050011 +B2000064348310N08023982WA021550225100711114039008 +B2000114348269N08023879WA021480224600711115040008 +B2000164348235N08023760WA021260222300711134046009 +B2000214348193N08023631WA021160220800711136047010 +B2000264348143N08023510WA021120220400711129047010 +B2000314348091N08023402WA021090220000711122048010 +B2000364348036N08023304WA021070219700711117043009 +B2000414347978N08023213WA021010219200711116043009 +B2000464347912N08023119WA020960218600711114040009 +B2000514347851N08023034WA020900217800711116041011 +B2000564347787N08022951WA020890217800711115063009 +B2001014347719N08022877WA020910218000711117044010 +B2001064347645N08022816WA021060219700711107039007 +B2001114347579N08022772WA021180221000711090048009 +B2001164347519N08022738WA021180220800711086040008 +B2001214347453N08022707WA021040219300911099039009 +B2001264347378N08022670WA020920218100911110040010 +B2001314347298N08022631WA020830217100711115041009 +B2001364347214N08022591WA020760216300710119043010 +B2001414347128N08022551WA020600214700710124042011 +B2001464347036N08022513WA020500213800910124049010 +B2001514346950N08022478WA020510214000710117041008 +B2001564346866N08022447WA020440213200710116041009 +B2002014346779N08022423WA020320212000710119040009 +B2002064346689N08022400WA020180210600710124043009 +B2002114346595N08022380WA020040209000710129045009 +B2002164346497N08022358WA019920207800710132046008 +B2002214346399N08022336WA019850206900710132053010 +F20022105200211292330131815 +B2002264346304N08022316WA019850207300710124048007 +B2002314346213N08022297WA019850207100710122043009 +B2002364346124N08022269WA019820206800710119045009 +B2002414346038N08022237WA019780206400710119044009 +B2002464345951N08022202WA019660205200710124045009 +B2002514345860N08022162WA019550203900810129050009 +B2002564345765N08022123WA019420202500810135048009 +B2003014345665N08022083WA019320201400710139055009 +B2003064345565N08022042WA019210200400710139049009 +B2003114345464N08022008WA019170200000710136052008 +B2003164345366N08021977WA019090199200710134049009 +B2003224345268N08021947WA019030198500710132053008 +B2003274345170N08021922WA018950197800710131046008 +B2003324345072N08021895WA018800196100710137052008 +B2003374344971N08021867WA018750195700710139050008 +B2003424344867N08021833WA018700195100710141053011 +B2003474344765N08021801WA018730195500710138049008 +B2003524344665N08021765WA018730195500710138047010 +B2003574344565N08021732WA018730195600710136048010 +B2004024344465N08021694WA018680195000710138044008 +B2004074344364N08021659WA018530193600710141051009 +B2004124344260N08021623WA018450192600710141051008 +B2004174344157N08021584WA018390191900810143052007 +B2004224344052N08021543WA018240190400810148053008 +B2004274343945N08021499WA018150189300710148064012 +B2004324343829N08021457WA018160189900710140052010 +B2004374343731N08021422WA018180189900710133048009 +B2004424343633N08021390WA018110189100710134047009 +B2004474343533N08021359WA018010188000710139049008 +B2004524343430N08021321WA017870186500710142049009 +B2004574343328N08021282WA017730185100710140052010 +B2005024343229N08021245WA017640184200710132049009 +B2005074343134N08021215WA017570183600710127043008 +B2005124343040N08021189WA017490182800710128043008 +B2005174342945N08021159WA017360181300810134047008 +B2005224342844N08021120WA017210179800710141048009 +B2005274342744N08021071WA017170179200710141053009 +B2005324342645N08021022WA017140178800710138057011 +B2005374342553N08020965WA017160179300710130047009 +B2005424342470N08020914WA017300180900710112045008 +B2005474342397N08020871WA017370181600710100039009 +B2005524342334N08020819WA017330181000710096039009 +B2005574342267N08020791WA017290180700710092057010 +B2006024342203N08020828WA017250180400710096064011 +B2006074342148N08020893WA017330181400710095039009 +B2006124342093N08020958WA017320181200710097048010 +B2006174342041N08021027WA017260180500710095036009 +B2006224341992N08021101WA017160179500710096040009 +B2006274341942N08021178WA017040178200710101039009 +B2006324341892N08021262WA016950177200710107038009 +B2006374341844N08021352WA016860176400710108040010 +B2006424341792N08021436WA016840176200710103046009 +B2006474341743N08021518WA016760175300710100041009 +B2006524341698N08021599WA016680174700710098039009 +B2006574341650N08021679WA016600173800710101043009 +B2007024341595N08021755WA016550173200710105041009 +B2007074341537N08021830WA016540173200710104043008 +B2007124341482N08021906WA016590173800710102040009 +B2007174341427N08021975WA016660174400710098037009 +B2007224341373N08022044WA016710174900710099041011 +B2007274341313N08022097WA016810175800710097078013 +B2007324341258N08022038WA016910177100810099061010 +B2007374341253N08021936WA017030178400710105087011 +B2007424341307N08021870WA017140179600710094084011 +B2007474341368N08021894WA017190180200710083060010 +B2007524341394N08021966WA017240180600810075059010 +B2007574341373N08022031WA017270180800710070070009 +B2008024341328N08022079WA017240180400710078061009 +B2008074341274N08022118WA017210180100710084070009 +B2008124341215N08022156WA017290180900710086043009 +B2008174341153N08022199WA017340181400710096070012 +B2008224341086N08022177WA017480182900710094061010 +B2008274341080N08022083WA017530183400710099048011 +B2008324341140N08022035WA017540183800710094042011 +B2008374341198N08022082WA017690185300710091045008 +B2008424341210N08022162WA017860187000710084046011 +B2008474341149N08022170WA017940188000710093051011 +B2008524341127N08022083WA018020188800710095040011 +B2008574341179N08022019WA018070189300710101043013 +B2009024341247N08022047WA018260191400710090053009 +B2009074341270N08022121WA018410192700710085040012 +B2009124341210N08022150WA018490193600710098070013 +B2009174341155N08022088WA018650195500710096054010 +B2009224341156N08021990WA018760196700710099048010 +B2009274341213N08021931WA018910198100710095045011 +B2009324341269N08021969WA019070199900710081042011 +B2009374341260N08022043WA019230201500710077055011 +B2009424341205N08022049WA019380203200710081050009 +B2009474341173N08021970WA019390203100710106038014 +B2009524341235N08021916WA019420203500710100068011 +B2009574341283N08021975WA019610205500710082069010 +B2010024341272N08022053WA019760206900710079068012 +B2010074341215N08022051WA019870208100710088047011 +B2010124341192N08021965WA019920208800710096056010 +B2010174341231N08021882WA019980209400710097063010 +B2010224341301N08021856WA020090210400710098063009 +B2010274341371N08021877WA020250211800710091060010 +B2010324341407N08021952WA020390213500710077052009 +B2010374341374N08022019WA020400213200710087034012 +B2010424341311N08022003WA020550215000710089068010 +B2010474341299N08021916WA020710216700710092042009 +B2010524341348N08021841WA020700216500710104034013 +B2010574341420N08021847WA020880218600810090031008 +B2011024341473N08021895WA020900218500710088047011 +B2011074341476N08021980WA020900218700710083075010 +B2011124341424N08022026WA020930218800710088057010 +B2011174341356N08022022WA021050220100710093065010 +B2011224341326N08021941WA021180221400710098051011 +B2011274341375N08021874WA021220221800710094039012 +B2011324341428N08021913WA021330223100710078054010 +B2011374341420N08021990WA021400223800710079060011 +B2011424341366N08022018WA021550225500710079067009 +B2011474341313N08021980WA021590225700710088038010 +B2011524341290N08021887WA021670226700810095063010 +B2011574341323N08021810WA021730227400810087047008 +B2012024341390N08021792WA021600225800710096054012 +B2012074341456N08021820WA021660226700710089058008 +B2012124341514N08021868WA021750227300809089044009 +B2012174341565N08021926WA021760227200710087059010 +B2012224341567N08022008WA021700226500710083052012 +B2012274341507N08022031WA021740227100710090065011 +B2012324341454N08021976WA021860228500710090058009 +B2012374341436N08021885WA021910229000810096049010 +B2012424341458N08021786WA022040230300710099099010 +B2012474341499N08021702WA022150231500710096055009 +B2012524341559N08021645WA022190231900710097067010 +B2012574341625N08021664WA022200232000710089058010 +B2013024341644N08021747WA022170231400710084065010 +B2013074341601N08021805WA022150231500710084068010 +B2013124341539N08021792WA022170231700710089076010 +B2013174341496N08021715WA022270232800710095041009 +B2013224341496N08021619WA022340233600710095048009 +B2013274341538N08021536WA022230232300710104040012 +B2013324341608N08021530WA022300233200710088065010 +B2013374341644N08021600WA022290233000710086063010 +B2013424341640N08021692WA022250232500710088033010 +B2013474341640N08021778WA022300233100710081055009 +B2013524341633N08021863WA022320233100710082052009 +B2013574341622N08021950WA022350233300710088079010 +B2014024341610N08022040WA022470234600710086034008 +B2014074341599N08022131WA022480234500710093071010 +B2014124341587N08022232WA022480234500710104034009 +B2014174341569N08022342WA022480234600710111037010 +B2014224341556N08022451WA022530235200710099035008 +B2014274341551N08022546WA022480234600710091050009 +B2014324341539N08022647WA022290232600710107036010 +B2014374341521N08022763WA022170231300710119037009 +B2014424341497N08022883WA022130230800710116041011 +B2014474341470N08022984WA022220232100710094033009 +B2014524341454N08023071WA022240232200710084056009 +B2014574341436N08023156WA022170231500710086060009 +B2015024341418N08023243WA022110230800710086060009 +B2015074341395N08023326WA022050230300710086070008 +B2015124341365N08023410WA021960229300809094037010 +B2015174341338N08023504WA021890228500710100040010 +B2015224341313N08023601WA021880228500710098036009 +B2015274341292N08023698WA021880228600810095035009 +B2015324341278N08023792WA021850228300710092037009 +B2015374341267N08023889WA021770227400710096060010 +B2015424341276N08023990WA021730227000710098042009 +B2015474341289N08024092WA021620225700710101048009 +B2015524341300N08024200WA021510224500710108036009 +B2015574341313N08024312WA021460223800710108034009 +B2016024341325N08024421WA021440223600710105037010 +B2016074341336N08024529WA021280222900710108064011 +B2016124341343N08024644WA021280221800710112263010 +B2016174341353N08024762WA021130220000710118387009 +B2016224341363N08024887WA021000218500710125415009 +B2016274341368N08025016WA020940217900710122420009 +B2016334341373N08025143WA020850216800710125465008 +B2016384341378N08025275WA020780216000710125428009 +B2016434341384N08025401WA020780216100710118356009 +B2016484341388N08025521WA020740215800710112355009 +B2016534341386N08025634WA020740215700710106273009 +B2016584341385N08025743WA020710215400710103368010 +B2017034341389N08025843WA020720215700710092283009 +B2017084341382N08025936WA020680215200710089412010 +B2017134341358N08026023WA020600214600810093473009 +B2017184341317N08026107WA020590214500710098286010 +B2017234341267N08026183WA020670215200710103359010 +B2017284341202N08026254WA020800216400710114348008 +B2017334341130N08026249WA020990218700710093399011 +B2017384341132N08026164WA020910218000710091260011 +B2017434341209N08026149WA020760216400810108386011 +B2017484341276N08026209WA020960218500710107349009 +B2017534341322N08026296WA021090220000710104391013 +B2017584341282N08026363WA021200221000710092373013 +B2018034341244N08026299WA021220221100710101484016 +B2018084341320N08026278WA021300222400710111303011 +B2018134341356N08026366WA021510224800710095323010 +B2018184341316N08026436WA021540225000710089310012 +B2018234341259N08026406WA021590225600810085426011 +B2018284341243N08026319WA021670226400710087338011 +B2018334341263N08026234WA021880228600710086578008 +B2018384341308N08026174WA022010229800710090254012 +B2018434341372N08026198WA022120231100710090435010 +B2018484341396N08026277WA022200232100710083449009 +B2018534341360N08026343WA022220232100710086286010 +B2018584341295N08026341WA022250232300710090334010 +B2019034341246N08026280WA022370233500710088372010 +B2019084341221N08026198WA022510235000710086405010 +B2019134341253N08026125WA022520235100710091304011 +B2019184341319N08026141WA022570235900710095426009 +B2019234341353N08026221WA022710237300710088468009 +B2019284341347N08026309WA022800238100710088411009 +B2019334341303N08026375WA022830238000710092281012 +B2019384341251N08026327WA022800237600710099379015 +B2019434341296N08026256WA022860238500710097333010 +B2019484341370N08026246WA022930239100710102472010 +B2019534341451N08026256WA022930239000710110239009 +B2019584341530N08026275WA023040240000710102212008 +B2020034341601N08026301WA023120240900710095402009 +B2020084341673N08026324WA023120240500710107537010 +B2020134341759N08026348WA023030239500710124298008 +B2020184341855N08026377WA022850239300710129053007 +B2020234341949N08026414WA022820238400710134064010 +B2020284342053N08026437WA022620236500710147025010 +B2020334342169N08026449WA022400234200710161025009 +B2020384342295N08026456WA022140231500710174031009 +B2020434342432N08026461WA021860228600710186039009 +B2020484342569N08026464WA021840228300710179037008 +B2020534342702N08026464WA021750227300710176032009 +B2020584342833N08026464WA021710226800710171031009 +B2021034342958N08026465WA021730227000710161029009 +B2021084343074N08026466WA021760227100710151026009 +B2021134343186N08026464WA021740226800710146025007 +B2021184343296N08026464WA021640225700710147025009 +B2021234343406N08026462WA021560225000710146025009 +B2021284343516N08026465WA021500224300710145025009 +B2021334343623N08026469WA021520224600710140027008 +B2021384343725N08026469WA021550224800710136025009 +B2021434343830N08026464WA021430223600710140025009 +B2021484343937N08026461WA021280222100710146024010 +B2021534344050N08026465WA021180221000710152024010 +B2021584344166N08026467WA021060219800710154026009 +B2022034344280N08026460WA020960218800710149030010 +B2022084344389N08026449WA020980219000710139026009 +B2022134344493N08026441WA020930218300710142030009 +B2022184344600N08026432WA020850217400710144027009 +B2022234344709N08026426WA020910217900710142025009 +B2022284344813N08026419WA020930218200710137025009 +B2022334344915N08026413WA020890217800710134024009 +B2022384345016N08026409WA020820217100710137024008 +B2022434345122N08026409WA020700215900710146024009 +B2022484345235N08026413WA020610214900710153024009 +B2022534345351N08026407WA020540214300710156027009 +B2022584345469N08026394WA020430213100710159027009 +B2023034345590N08026379WA020290211900710164027009 +B2023084345712N08026369WA020270211600710158029009 +B2023134345828N08026362WA020270211400710152027009 +B2023184345954N08026361WA020190210500710151026008 +B2023234346067N08026356WA020110209600710150026010 +B2023284346177N08026346WA020060209200710144025008 +B2023334346285N08026339WA019930207800710143025009 +B2023384346394N08026333WA019790206300710146025010 +B2023434346504N08026323WA019660205000710149024010 +B2023484346616N08026312WA019550203900710148024009 +B2023534346727N08026301WA019490203200710147024009 +B2023584346835N08026288WA019400202200710145024009 +B2024034346946N08026272WA019260200900710150024009 +B2024084347061N08026260WA019140199600710156024010 +B2024134347179N08026255WA019030198600710158025009 +B2024184347297N08026249WA019020198600710154027010 +B2024234347409N08026241WA019060199000710144025008 +B2024284347517N08026231WA019000198200710144024009 +B2024334347625N08026221WA018930197500710144024009 +B2024384347732N08026209WA018890197000710142024008 +B2024434347841N08026192WA018690195100710151024011 +B2024484347946N08026135WA018630194800710144028007 +B2024534348041N08026068WA018620194600710141043008 +B2024584348138N08026004WA018560194000710143026009 +B2025034348237N08025940WA018490193400710148026010 +B2025084348337N08025872WA018480193400710148026009 +B2025134348434N08025801WA018550194200710140026010 +B2025184348523N08025739WA018650195300710130024009 +B2025234348610N08025682WA018710195900710125023009 +B2025284348693N08025629WA018810196800710120023009 +B2025334348774N08025575WA018890197500710118022010 +B2025384348851N08025514WA018960198300710119022010 +B2025434348933N08025458WA019000198800710123022009 +B2025484349020N08025407WA018970198400710127022009 +B2025534349110N08025362WA018870197300710129022011 +B2025584349204N08025317WA018810196700710134022009 +B2026034349300N08025270WA018790196500710138022008 +B2026084349399N08025225WA018770196300710139022009 +B2026134349501N08025186WA018740196100710141022008 +B2026184349603N08025133WA018660195200710147023009 +B2026234349703N08025074WA018630194900710143023008 +B2026284349801N08025020WA018600194500710138026010 +B2026334349897N08024966WA018520193700710139024009 +B2026384349997N08024914WA018450193000710143024009 +B2026434350101N08024868WA018400192600710145024009 +B2026484350193N08024873WA018700195400710106026011 +B2026534350210N08024958WA018840197100710082023012 +B2026584350169N08025010WA018970198300710074022009 +B2027034350110N08025008WA018990198700710084021009 +B2027084350057N08024957WA019030199000710089021010 +B2027134350035N08024864WA019030199000710101021010 +B2027184350056N08024760WA019020199100710106021010 +B2027234350110N08024682WA019020199200710104021009 +B2027284350182N08024644WA019000199000710102021010 +B2027334350255N08024647WA019020199200710095021009 +B2027384350319N08024689WA019040199200710094021010 +B2027434350362N08024767WA019020199200710094021008 +B2027484350387N08024866WA018980198700710105021010 +B2027534350408N08024969WA019110200000710099021009 +B2027584350428N08025064WA019210200900710094021011 +B2028034350417N08025156WA019360202400710087021009 +B2028084350362N08025182WA019460203500710079021010 +B2028134350312N08025136WA019570204600710084021009 +B2028184350287N08025051WA019670205600710090022009 +B2028234350293N08024957WA019780206800710093022009 +B2028284350333N08024876WA019790207200710097022010 +B2028334350401N08024860WA019830207800710090023010 +B2028384350447N08024922WA019880208400710089023010 +B2028434350431N08025008WA019930208800710087024011 +B2028484350372N08025031WA020080210300710083021010 +B2028534350323N08024978WA020180211300710086021010 +B2028584350310N08024890WA020280212300710088023010 +B2029034350338N08024808WA020310212600810090022010 +B2029094350400N08024770WA020270212200710090022010 +B2029134350464N08024799WA020290212500710093022010 +B2029194350507N08024873WA020370213400710090023009 +B2029244350512N08024961WA020440214000710082021010 +B2029294350480N08025031WA020510214700710079022009 +B2029344350423N08025062WA020590215500710084023009 +B2029394350360N08025053WA020700216600710083022009 +B2029444350304N08025020WA020780217500710082021009 +B2029494350268N08024946WA020780217400710092021010 +B2029544350270N08024849WA020770217300710096023010 +B2029594350309N08024765WA020800217700710095023009 +B2030044350374N08024730WA020830218200709091022009 +B2030094350440N08024749WA020830217900710089022010 +B2030144350494N08024805WA020870218400810093021009 +B2030194350544N08024876WA020870218400809097021010 +B2030244350589N08024957WA020870218300810098021009 +B2030294350640N08025049WA020960219200809102021009 +B2030344350690N08025129WA021120220800809101021009 +B2030394350714N08025219WA021140221200810089032014 +B2030444350663N08025232WA021190221600810079022011 +B2030494350647N08025142WA021240222000810101023009 +B2030544350670N08025041WA021360223500810101023009 +B2030594350721N08024971WA021560225600810095022010 +B2031044350786N08024993WA021650226600810094021012 +B2031094350794N08025077WA021690227100810075021011 +B2031144350745N08025092WA021710227000810085021013 +B2031194350720N08025004WA021840228600810093022010 +B2031244350744N08024919WA022000230300810089022010 +B2031294350806N08024886WA022040230900810094023009 +B2031344350880N08024901WA022060230900810102021009 +B2031394350955N08024924WA022090231200810102021009 +B2031444351028N08024955WA022120231400810099021009 +B2031494351100N08024985WA022120231100810100021008 +B2031544351176N08025018WA021990229700810113021009 +B2031594351259N08025060WA021920229100810121021010 +B2032044351343N08025102WA021960229500810116021010 +B2032094351420N08025151WA021980229700810109021008 +B2032144351496N08025193WA021930228900810112021010 +B2032194351576N08025236WA021880228400810115021008 +B2032244351658N08025280WA021810227600809118021009 +F203224052002292330131815 +B2032294351742N08025319WA021750226900809117021010 +B2032344351824N08025348WA021770227300809106021008 +B2032394351900N08025379WA021700226500809108021009 +B2032444351979N08025419WA021550224900809116021010 +B2032494352066N08025457WA021400223400809124021009 +B2032544352155N08025497WA021350222800809124021009 +B2032594352244N08025537WA021300222300809123021010 +B2033044352341N08025571WA021230221600809123021010 +B2033094352429N08025598WA021230221600809116021009 +B2033144352514N08025630WA021190221000809119021009 +B2033194352601N08025661WA021160220700809117021009 +B2033244352684N08025683WA021170220800809109021009 +B2033294352765N08025708WA021100220100809112021009 +B2033344352848N08025736WA021020219200809116021010 +B2033394352934N08025764WA020970218800809116021009 +B2033444353018N08025793WA020950218600809115021009 +B2033494353101N08025824WA020900217900809116021010 +B2033544353185N08025854WA020870217600809115021009 +B2033594353268N08025886WA020810217100809114021009 +B2034044353351N08025927WA020710216100809120021009 +B2034094353438N08025969WA020670215600809123021009 +B2034144353525N08026010WA020650215500809123022009 +B2034194353614N08026041WA020690215900809121023008 +B2034244353703N08026066WA020640215300809122022009 +B2034294353791N08026092WA020600214800809118022008 +B2034344353878N08026123WA020500213800809121021010 +B2034394353967N08026155WA020390212600809123021010 +B2034444354058N08026182WA020330212000809122023011 +B2034494354143N08026198WA020570214400809105022011 +B2034544354211N08026202WA020750216200809090021009 +B2034594354286N08026213WA020740216000809103022010 +B2035044354360N08026225WA020810216800809096021008 +B2035094354425N08026236WA020810216800809101022010 +B2035144354509N08026253WA020810216700809104022009 +B2035194354586N08026266WA020780216400809101020008 +B2035244354666N08026280WA020610214800810113020009 +B2035294354754N08026298WA020470213400809121020009 +B2035344354845N08026314WA020390212500810123020010 +B2035394354937N08026332WA020290211600809125020009 +B2035444355030N08026354WA020210210700809126020009 +B2035494355124N08026370WA020090209600809126020010 +B2035544355218N08026388WA020060209200809124020010 +B2035594355305N08026403WA020080209400809112020008 +B2036044355389N08026414WA020040208900810111020009 +B2036094355473N08026422WA019930207800809114020009 +B2036144355562N08026430WA019820206700809120020009 +B2036194355652N08026444WA019720205700809122053009 +B2036244355744N08026465WA019600204500809125024009 +B2036294355838N08026475WA019570204400810123023010 +B2036344355924N08026457WA019680205500810111021008 +B2036394356003N08026428WA019780206200810107021009 +B2036444356078N08026388WA019810206600810105029012 +B2036494356154N08026390WA019960208200710099022010 +B2036544356205N08026452WA020080209500710086023011 +B2036594356184N08026516WA020170210600710071023011 +B2037044356133N08026485WA020210211100710086024011 +B2037094356120N08026397WA020350212600710091022011 +B2037144356158N08026319WA020450213800710094022009 +B2037194356228N08026296WA020490214300710097022010 +B2037244356285N08026345WA020520214800710088021010 +F20372405200229233024131815 +B2037294356283N08026426WA020600215500710078022009 +B2037344356235N08026463WA020660216200710077022010 +B2037394356180N08026434WA020750217100710082021010 +B2037444356149N08026358WA020850218100710086022009 +B2037494356139N08026268WA020920218700710089022009 +B2037544356166N08026177WA020900218600710102022011 +B2037594356235N08026139WA020970219400710098022009 +B2038044356303N08026155WA021010219900710088020010 +B2038094356340N08026222WA021060220500710080021008 +B2038144356343N08026301WA021110220900710075021010 +B2038194356311N08026358WA021200221700710066025009 +B2038244356260N08026366WA021220221900710076023010 +B2038294356214N08026306WA021240222100710092021011 +B2038344356218N08026215WA021370223500710088021009 +B2038394356267N08026152WA021360223300710096021010 +B2038444356342N08026134WA021290222700710105021010 +B2038494356420N08026136WA021310222900710102021009 +B2038544356496N08026154WA021310222700710103021009 +B2038594356573N08026182WA021290222400710108020009 +B2039054356651N08026215WA021280222400710106020009 +B2039104356727N08026253WA021280222200710110020008 +B2039154356805N08026291WA021240221800809109020009 +B2039204356882N08026331WA021220221600710110024009 +B2039254356957N08026379WA021250222000710109021009 +B2039304357038N08026434WA021290222600710109021008 +B2039354357112N08026487WA021320222600710112021009 +B2039404357188N08026542WA021290222300710114021008 +B2039454357265N08026593WA021250221900710112020009 +B2039504357340N08026636WA021200221200710108020010 +B2039554357416N08026679WA021080220100710110021011 +B2040004357493N08026725WA021060219800710111021009 +B2040054357572N08026769WA020960218900710114021009 +B2040104357650N08026815WA020950218800710112021010 +B2040154357728N08026844WA020950218800710101020008 +B2040204357805N08026866WA020830217400710108020009 +B2040254357887N08026895WA020700216000710116020010 +B2040304357972N08026925WA020660215600809116020010 +B2040354358052N08026954WA020690215800809108020009 +B2040404358129N08026985WA020670215700810102020008 +B2040454358202N08027016WA020610214900710103020009 +B2040504358280N08027050WA020440213200710113020010 +B2040554358361N08027097WA020340212300710119020010 +B2041004358446N08027139WA020290211900710120020009 +B2041054358530N08027188WA020220211100710121020010 +B2041104358612N08027238WA020220211200710119020009 +B2041154358693N08027287WA020220211200710115020009 +B2041204358770N08027336WA020220211300710109020010 +B2041254358841N08027388WA020210211100710106020008 +B2041304358914N08027439WA020090209900710109020009 +B2041354358988N08027489WA020050209500710109020009 +B2041404359061N08027537WA020000209000710108020009 +B2041454359135N08027586WA019890207900710111020009 +B2041504359212N08027637WA019770206600710113020009 +B2041554359289N08027685WA019700205900710110020010 +B2042004359359N08027733WA019690205700710100020009 +B2042054359426N08027789WA019560204500710107020009 +B2042104359494N08027851WA019520204000710109020009 +B2042154359563N08027913WA019480203700710108020009 +B2042204359633N08027971WA019430203200710108020009 +B2042254359703N08028032WA019280201800710111020009 +B2042304359776N08028096WA019100200000710120020009 +B2042354359857N08028162WA018950198500710127020009 +B2042404359940N08028230WA018800196900710130020009 +B2042454400026N08028296WA018690195700710131020009 +B2042504400113N08028358WA018580194700710130020009 +B2042554400199N08028423WA018500193700710129020010 +B2043004400286N08028482WA018430193100710130020009 +B2043054400374N08028541WA018340192100710130020010 +B2043104400462N08028596WA018260191200710127020009 +B2043154400548N08028651WA018170190300710126021010 +B2043204400631N08028709WA018200190700710116022010 +B2043254400704N08028760WA018310191700710105021008 +B2043304400772N08028817WA018310191600710108022010 +B2043354400842N08028881WA018340192100710112021010 +B2043404400911N08028949WA018430193000710112022010 +B2043454400982N08029016WA018550194100710121031013 +B2043504401072N08028999WA018680195700710124022011 +B2043554401120N08028901WA018770196600710111022011 +B2044004401083N08028821WA018860197600710089022012 +B2044054401028N08028864WA018920198200810100022011 +B2044104401037N08028975WA019070199700710113026009 +B2044154401108N08029042WA019290202000710119026008 +B2044204401192N08029014WA019420203200710111024010 +B2044254401226N08028924WA019520204200710090022011 +B2044304401187N08028860WA019610205200710079022009 +B2044354401128N08028896WA019670205800710095021010 +B2044404401132N08028999WA019820207500710111027013 +B2044454401210N08029030WA020040209600809115024012 +B2044504401264N08028952WA020090210200710098024011 +B2044554401244N08028871WA020150210700710078022011 +B2045004401191N08028885WA020270212000710078021009 +B2045054401167N08028967WA020340212900710097021011 +B2045104401218N08029056WA020380213300910127021011 +B2045154401315N08029044WA020360213000710136024012 +B2045204401362N08028936WA020430213700710106023012 +B2045254401339N08028856WA020680216100710073022008 +B2045304401296N08028808WA020750217100710076022010 +B2045354401247N08028765WA020870218300710074023009 +B2045404401195N08028741WA020910218600710077021010 +B2045454401151N08028795WA020870218300710091021011 +B2045504401169N08028893WA020940219000710106021011 +B2045554401236N08028962WA021030219900710112021010 +B2046004401318N08028994WA021110220600710114021009 +B2046054401397N08028951WA021170221200710113021009 +B2046104401427N08028857WA021200221600710091028012 +B2046154401392N08028806WA021340223000909065022010 +B2046204401356N08028861WA021310223000710089022011 +B2046254401365N08028960WA021360223500710104021010 +B2046304401412N08029049WA021460224400710107022008 +B2046354401476N08029120WA021480224500711112022008 +B2046404401547N08029186WA021450224000711111024009 +B2046454401615N08029251WA021380223400711108022009 +B2046504401677N08029319WA021360223200711103022009 +B2046554401740N08029384WA021290222400711105021009 +B2047004401807N08029452WA021160221100711116025012 +B2047054401889N08029442WA021080220400810113025012 +B2047104401903N08029348WA020990219300810090028012 +B2047154401847N08029301WA020880218400711090022009 +B2047204401779N08029264WA020710216700711101022009 +B2047254401703N08029228WA020620215300711111022009 +F2047250520022923302413101815 +B2047304401618N08029192WA020400213000711124023009 +B2047354401522N08029155WA020220211000711136026010 +B2047404401423N08029121WA020270211700711134030008 +B2047454401325N08029094WA020280211900711131028009 +B2047504401231N08029065WA020300212000711128027009 +B2047554401137N08029036WA020290211900611126044011 +B2048004401046N08029006WA020350212600611125027009 +B2048054400952N08028975WA020370212700611130033010 +B2048104400855N08028949WA020310212100611132029010 +B2048154400756N08028920WA020190211000611135038008 +B2048204400657N08028886WA020090210000611136027009 +B2048254400558N08028847WA020010209100611137026009 +B2048304400459N08028807WA019910208100611137026009 +B2048354400357N08028767WA019770206700611142032008 +B2048404400253N08028730WA019670205600611144033009 +B2048454400148N08028693WA019560204600611145030009 +B2048504400041N08028654WA019480203700611147029009 +B2048554359936N08028614WA019460203500611144029008 +B2049004359831N08028573WA019350202300611145029009 +B2049054359726N08028537WA019290201700611142028009 +B2049104359623N08028506WA019220201000611139028009 +B2049154359521N08028474WA019110200000611139027010 +B2049204359419N08028439WA019000198800611140027010 +B2049254359316N08028409WA018920198000611139027009 +B2049314359213N08028384WA018800196700611140028009 +B2049364359108N08028358WA018660195300611142028011 +B2049414359005N08028333WA018570194400611138029009 +B2049464358903N08028313WA018450193200611136029009 +B2049514358802N08028293WA018270191400611136029010 +B2049564358701N08028271WA018130189900611137026008 +B2050014358598N08028252WA017930187800611138035009 +B2050064358497N08028225WA017860186900611136029009 +B2050114358387N08028190WA017790186200611136042009 +B2050164358289N08028151WA017750185900611136027010 +B2050214358190N08028116WA017740185800611135026009 +B2050264358091N08028084WA017710185300611136025008 +B2050314357989N08028049WA017580184100611142026009 +B2050364357886N08028012WA017490183100611139026009 +B2050414357786N08027976WA017360181800611136026009 +B2050464357686N08027943WA017220180400611136026009 +B2050514357587N08027911WA017030178400611137026009 +B2050564357486N08027877WA016850176700611138026009 +B2051014357384N08027848WA016740175400611138026009 +B2051064357282N08027827WA016640174400611137026008 +B2051114357179N08027805WA016500172900611140025009 +B2051164357074N08027782WA016420172200611141028009 +B2051214356969N08027760WA016390171900611140029009 +B2051264356866N08027735WA016340171300611141043009 +B2051314356759N08027711WA016320171200611143033011 +B2051364356653N08027688WA016390172000611141028008 +B2051414356549N08027668WA016440172600611139029009 +B2051464356445N08027647WA016420172100611140027008 +B2051514356341N08027629WA016330171200611140026009 +B2051564356237N08027612WA016280170800611139026009 +B2052014356133N08027596WA016200169900611140026009 +B2052064356026N08027578WA016060168400611145028009 +B2052114355917N08027559WA015980167600611147030009 +B2052164355807N08027537WA015900166800611148030009 +B2052214355697N08027514WA015830166000611149042011 +B2052264355588N08027488WA015870166600611144029008 +B2052314355484N08027461WA015810165900611141028009 +B2052364355381N08027436WA015750165200611137028009 +B2052414355279N08027415WA015650164200611136026009 +B2052464355178N08027392WA015510162800611137026008 +B2052514355076N08027371WA015380161500611135026008 +B2052564354976N08027349WA015200159600611137033010 +B2053014354874N08027324WA015090158500611137037006 +B2053064354774N08027304WA014970157100611132028009 +B2053114354677N08027294WA014860156000611129028009 +B2053164354579N08027284WA014640153800611131035010 +B2053214354481N08027271WA014530152500611131031010 +B2053264354383N08027263WA014470152100611129029009 +B2053314354286N08027254WA014300150300611135038010 +B2053364354176N08027242WA014080147900611153031007 +B2053414354057N08027227WA013830145300611163054009 +B2053464353936N08027211WA013700144100611159043009 +B2053514353819N08027193WA013570142700611155032010 +B2053564353705N08027172WA013490141800611151029008 +B2054014353592N08027152WA013320140100611151031009 +B2054064353478N08027133WA013190138700611154031010 +B2054114353363N08027119WA013100137700611152034008 +B2054164353249N08027106WA013000136700611154032011 +B2054214353132N08027094WA013000136700611153031010 +B2054264353019N08027082WA013030137100611149034008 +B2054314352910N08027069WA013030136900611145030009 +B2054364352802N08027050WA012950136200611144028009 +B2054414352695N08027024WA012820134800611146030009 +B2054464352587N08026991WA012710133600611147030007 +B2054514352477N08026958WA012540131900611154035009 +B2054564352360N08026937WA012410130500611160035009 +B2055014352238N08026925WA012350129900612163042010 +B2055064352116N08026923WA012320129500612163040010 +B2055114351994N08026925WA012300129300612160035009 +B2055164351875N08026928WA012260129000612158041010 +B2055214351756N08026933WA012170127900611157036009 +B2055264351641N08026944WA012130127600611148032008 +B2055314351533N08026967WA012100127100611144028009 +B2055364351430N08027005WA012020126300711141028010 +B2055414351331N08027054WA011970125700711137028009 +B2055464351238N08027111WA011910125100711134026009 +B2055514351148N08027169WA011840124400611128025010 +B2055564351059N08027212WA011800123900611123024008 +B2056014350962N08027250WA011770123600711120025008 +B2056064350874N08027277WA011670122500611122024009 +B2056114350781N08027303WA011560121300611127024009 +B2056164350684N08027319WA011450120100611132061010 +B2056214350584N08027320WA011380119500611133028009 +B2056264350487N08027313WA011420120000611124027008 +B2056314350397N08027304WA011450120200611118026009 +B2056364350311N08027291WA011490120700611110024009 +B2056414350236N08027275WA011530121000611097200009 +B2056464350165N08027250WA011380119600611098176009 +B2056514350098N08027209WA011320118900611093128008 +B2056564350034N08027162WA011190117700610101124009 +B2057014349968N08027103WA011070116400611107222009 +B2057064349900N08027038WA010990115500611110275005 +B2057114349833N08026964WA010810113700611118260009 +B2057164349765N08026893WA010650111800611111216009 +B2057214349701N08026821WA010490110300611109315010 +B2057264349641N08026752WA010430109600611100169007 +F2057260520272923302413101815 +B2057314349586N08026681WA010210107300611101178009 +B2057364349536N08026601WA009970104800611103155009 +B2057414349493N08026510WA009720102200611107176009 +B2057464349463N08026405WA009520100000611109258009 +B2057514349443N08026292WA009330098000611111239008 +B2057564349434N08026177WA009150096200611112365009 +B2058014349445N08026061WA009000094700610112186009 +B2058064349471N08025949WA008850093200611113219009 +B2058114349508N08025842WA008670091300611115265009 +B2058164349549N08025739WA008460089100611114226009 +B2058214349593N08025638WA008300087300611110182009 +B2058264349640N08025544WA008140085700611110172009 +B2058314349690N08025453WA007990084000611111230009 +B2058364349745N08025365WA007830082300611111199009 +B2058414349803N08025280WA007620080100611113169009 +B2058464349873N08025212WA007460078400611115227010 +B2058514349954N08025188WA007360077300611108160010 +B2058564350031N08025212WA007230076100611107151011 +B2059014350098N08025275WA007110075000611107118009 +B2059064350158N08025353WA006990073700611109139009 +B2059114350215N08025435WA006910072900611111124009 +B2059164350273N08025522WA006800071700611115165008 +B2059214350335N08025608WA006620069900611118153009 +B2059264350404N08025686WA006480068400611117149010 +B2059314350478N08025750WA006360067100710116154009 +B2059364350557N08025802WA006290066400710116141009 +B2059414350642N08025844WA006230065800710123168009 +B2059464350734N08025875WA006220065700611125222008 +B2059514350824N08025895WA006180065100611120203008 +B2059564350913N08025917WA006090064200611118299009 +B2100014350995N08025952WA006030063400711112236009 +B2100064351055N08026025WA005960062600611102273009 +B2100114351076N08026119WA005860061800610094163009 +B2100164351077N08026217WA005740060400611095173009 +B2100214351061N08026317WA005580058800611100148009 +B2100264351037N08026416WA005430057100611100279010 +B2100324351003N08026508WA005290055600611099344009 +B2100374350963N08026596WA005110053800611099174009 +B2100424350915N08026677WA004960052100611101239010 +B2100474350851N08026729WA004840050700611098257011 +B2100524350777N08026715WA004720049700611101143009 +B2100574350703N08026683WA004590048300611103195009 +B2101024350630N08026649WA004510047400611101158009 +B2101074350559N08026618WA004440046800611095149010 +B2101124350494N08026590WA004430046700611085059009 +B2101174350448N08026571WA004430046800611038999009 +B2101224350433N08026565WA004430046800611000078009 +B2101274350433N08026565WA004430046900611000031009 +B2101324350433N08026565WA004440046900611000112008 +B2101374350433N08026565WA004440046900611000021007 +B2101424350433N08026565WA004440046900611000026007 +B2101474350433N08026565WA004440046900611000018007 +B2101524350434N08026565WA004440046800611000018007 +B2101574350434N08026565WA004440046800611000018007 +B2102024350434N08026565WA004440046800611000017007 +B2102074350434N08026565WA004440046700611000017007 +B2102124350434N08026565WA004440046700611000017007 +B2102174350434N08026565WA004440046700611000018007 +B2102224350434N08026565WA004440046700611000018007 +B2102274350434N08026565WA004440046600611000017007 +B2102324350434N08026565WA004440046600611000017007 +B2102374350434N08026565WA004440046600611000017007 +B2102424350434N08026565WA004440046600611000017007 +B2102474350434N08026565WA004440046600611000017007 +B2102524350434N08026565WA004440046500611000017007 +B2102574350434N08026565WA004440046500611000018007 +B2103024350434N08026565WA004440046500611000087007 +B2103074350434N08026565WA004440046500611000041009 +B2103124350434N08026565WA004440046600610000018009 +B2103174350434N08026565WA004440046700611000017009 +B2103224350434N08026565WA004440046800611000017009 +B2103274350434N08026565WA004440046900611000017009 +B2103324350434N08026565WA004440046900611000017009 +B2103374350434N08026565WA004440047000611000017009 +B2103424350433N08026565WA004440047100611000017009 +B2103474350433N08026565WA004440047100611000017009 +B2103524350433N08026565WA004440047200611000056009 +B2103574350433N08026565WA004440047200611000045009 +B2104024350433N08026565WA004440047200611000018009 +B2104074350433N08026565WA004440047300611000017009 +B2104124350433N08026565WA004440047300611000017009 +B2104174350433N08026565WA004440047300610000017009 +B2104224350433N08026565WA004440047400611000017009 +B2104274350433N08026565WA004440047400611000017009 +B2104324350433N08026565WA004440047400611000032009 +B2104374350433N08026565WA004440047300611000047009 +B2104424350433N08026565WA004440047300611000018009 +B2104474350433N08026565WA004440047300611000018009 +B2104524350433N08026565WA004440047300611000018009 +B2104574350432N08026564WA004440047300611001018009 +B2105024350429N08026562WA004440047300611006146009 +B2105074350426N08026559WA004450047300611006158009 +B2105124350423N08026555WA004440047300611005289009 +B2105174350419N08026551WA004440047300611006052009 +B2105224350416N08026547WA004440047300611005048009 +B2105284350412N08026543WA004440047300611007142009 +B2105334350409N08026538WA004440047300611006088009 +B2105384350407N08026534WA004440047300611002057009 +B2105434350404N08026532WA004440047300611004027009 +B2105484350401N08026530WA004440047300611004022009 +B2105534350399N08026527WA004440047300611003020009 +B2105584350396N08026524WA004440047300611004029009 +B2106034350394N08026522WA004440047400611004022009 +B2106084350391N08026519WA004440047300611004043009 +B2106134350389N08026516WA004440047300611004038009 +B2106184350386N08026513WA004440047300611004057009 +B2106234350384N08026510WA004440047300611004027009 +B2106284350381N08026506WA004440047300611005034009 +B2106334350379N08026503WA004440047300611005036009 +B2106384350377N08026499WA004440047300611004025009 +B2106434350374N08026496WA004440047400611005031009 +B2106484350372N08026492WA004440047400611002214009 +B2106534350369N08026490WA004440047400611002268009 +B2106584350367N08026486WA004440047400611003624009 +B2107034350364N08026481WA004440047300611005999008 +B2107084350362N08026479WA004440047300611005234009 +B2107134350359N08026475WA004440047300611004048009 +B2107194350357N08026472WA004440047300611002024009 +B2107244350355N08026469WA004440047300611004025009 +B2107284350352N08026466WA004440047300610003032009 +F21072805202729302413101815 +B2107344350350N08026464WA004430047300611004023009 +B2107394350348N08026461WA004430047300611004045009 +B2107444350345N08026458WA004440047300611003346009 +B2107494350343N08026456WA004430047300611004571009 +B2107544350341N08026453WA004430047300611004658009 +B2107594350339N08026449WA004430047300611004120008 +B2108044350336N08026446WA004430047300611004298009 +B2108094350334N08026442WA004430047300611004105010 +B2108144350332N08026440WA004430047300611005147010 +B2108194350329N08026437WA004440047300611005234009 +B2108244350326N08026432WA004440047300611004604009 +B2108294350324N08026429WA004440047300611003299009 +B2108344350322N08026426WA004430047200611003689009 +B2108394350319N08026423WA004440047300611005556008 +B2108444350316N08026420WA004440047300611005662009 +B2108494350314N08026416WA004430047300611004298009 +B2108544350312N08026414WA004430047300611004066009 +B2108594350309N08026411WA004440047400611004170009 +B2109044350307N08026407WA004440047400611004152009 +B2109094350305N08026405WA004430047300611002021009 +B2109144350303N08026402WA004430047400611002022009 +B2109194350301N08026399WA004440047400611004076009 +B2109244350298N08026397WA004430047400611002211009 +B2109294350296N08026393WA004440047400611003814009 +B2109344350294N08026391WA004440047400611003060008 +B2109394350291N08026388WA004440047500611004597008 +B2109444350289N08026385WA004440047500610004388009 +B2109494350287N08026383WA004440047500610003085009 +B2109544350285N08026381WA004440047600610003022009 +B2110004350283N08026377WA004430047600610005027009 +B2110054350280N08026374WA004430047600610004027009 +B2110104350278N08026371WA004440047700610004037009 +B2110154350276N08026369WA004430047700610004029010 +B2110204350274N08026366WA004430047700610003031009 +B2110254350272N08026362WA004440047800610003020009 +B2110304350269N08026359WA004440047800610004026009 +B2110354350267N08026355WA004430047800610005035009 +B2110404350264N08026352WA004430047800610005064008 +B2110454350262N08026349WA004430047800610004076009 +B2110504350260N08026346WA004430047800610004118009 +B2110554350258N08026343WA004430047800709004081009 +B2111004350256N08026340WA004430047800710004024010 +B2111054350253N08026337WA004430047800610003091009 +B2111104350251N08026334WA004430047800610003246009 +B2111154350249N08026330WA004430047800610004187009 +B2111204350247N08026327WA004430047800610004062009 +G44071177A120858783749F154A23CC5863C2F421007D9B655E836D70A057C9B +G9EFB1A1CB0EAD0AC6792D781DB579B90B6ED8D7DA8D09499DE41737C0A410B2C +GE2D91CBD5E13CA4D08DECB413E4AEC29C5514F50A87C549D68A5732673BF92FA +G0DB8E5BE44DE87F53A2CAFBDB2E458D9D0421EC0B742A3BFA9009870052005D3 +GC0B739DC9781F70D79047A85C6B07C0115B545BC3C725D0FBE1395B5F01AF58E +G026E9170E7FF64BA31609B0DA8198094E26ABD0E63249DEF229AE0AB2979446F +G282AED diff --git a/reference/track/27GLQKF3.igc.kml b/reference/track/27GLQKF3.igc.kml new file mode 100644 index 000000000..3a7d4cab1 --- /dev/null +++ b/reference/track/27GLQKF3.igc.kml @@ -0,0 +1,13115 @@ + + + + GPS device + + + 2022-07-03T19:52:42Z + 2022-07-16T21:11:20Z + + -80.848608 + 43.660275 + 185763.618499 + + + + + + + + normal + #route_n + + + highlight + #route_h + + + + + + + + + normal + #track_n + + + highlight + #track_h + + + + + + + + + normal + #multiTrack_n + + + highlight + #multiTrack_h + + + + + + + + + normal + #waypoint_n + + + highlight + #waypoint_h + + + + + + Ground Speed + + + G Force? + + + # Of Sats + + + + Tracks + + PRESALTTRK + #multiTrack + + absolute + 2022-07-16T19:41:31Z + 2022-07-16T19:41:46Z + 2022-07-16T19:42:01Z + 2022-07-16T19:42:16Z + 2022-07-16T19:42:22Z + 2022-07-16T19:42:27Z + 2022-07-16T19:42:32Z + 2022-07-16T19:42:37Z + 2022-07-16T19:42:42Z + 2022-07-16T19:42:47Z + 2022-07-16T19:42:52Z + 2022-07-16T19:42:57Z + 2022-07-16T19:43:02Z + 2022-07-16T19:43:07Z + 2022-07-16T19:43:13Z + 2022-07-16T19:43:17Z + 2022-07-16T19:43:22Z + 2022-07-16T19:43:27Z + 2022-07-16T19:43:32Z + 2022-07-16T19:43:38Z + 2022-07-16T19:43:42Z + 2022-07-16T19:43:47Z + 2022-07-16T19:43:52Z + 2022-07-16T19:43:58Z + 2022-07-16T19:44:03Z + 2022-07-16T19:44:08Z + 2022-07-16T19:44:13Z + 2022-07-16T19:44:18Z + 2022-07-16T19:44:23Z + 2022-07-16T19:44:28Z + 2022-07-16T19:44:33Z + 2022-07-16T19:44:38Z + 2022-07-16T19:44:43Z + 2022-07-16T19:44:48Z + 2022-07-16T19:44:53Z + 2022-07-16T19:44:58Z + 2022-07-16T19:45:03Z + 2022-07-16T19:45:08Z + 2022-07-16T19:45:13Z + 2022-07-16T19:45:18Z + 2022-07-16T19:45:23Z + 2022-07-16T19:45:28Z + 2022-07-16T19:45:33Z + 2022-07-16T19:45:38Z + 2022-07-16T19:45:43Z + 2022-07-16T19:45:48Z + 2022-07-16T19:45:53Z + 2022-07-16T19:45:58Z + 2022-07-16T19:46:03Z + 2022-07-16T19:46:08Z + 2022-07-16T19:46:13Z + 2022-07-16T19:46:18Z + 2022-07-16T19:46:23Z + 2022-07-16T19:46:28Z + 2022-07-16T19:46:33Z + 2022-07-16T19:46:38Z + 2022-07-16T19:46:43Z + 2022-07-16T19:46:48Z + 2022-07-16T19:46:53Z + 2022-07-16T19:46:58Z + 2022-07-16T19:47:03Z + 2022-07-16T19:47:08Z + 2022-07-16T19:47:13Z + 2022-07-16T19:47:18Z + 2022-07-16T19:47:23Z + 2022-07-16T19:47:28Z + 2022-07-16T19:47:33Z + 2022-07-16T19:47:39Z + 2022-07-16T19:47:44Z + 2022-07-16T19:47:49Z + 2022-07-16T19:47:53Z + 2022-07-16T19:47:59Z + 2022-07-16T19:48:03Z + 2022-07-16T19:48:09Z + 2022-07-16T19:48:14Z + 2022-07-16T19:48:19Z + 2022-07-16T19:48:24Z + 2022-07-16T19:48:29Z + 2022-07-16T19:48:34Z + 2022-07-16T19:48:39Z + 2022-07-16T19:48:44Z + 2022-07-16T19:48:49Z + 2022-07-16T19:48:54Z + 2022-07-16T19:48:59Z + 2022-07-16T19:49:04Z + 2022-07-16T19:49:09Z + 2022-07-16T19:49:14Z + 2022-07-16T19:49:19Z + 2022-07-16T19:49:24Z + 2022-07-16T19:49:29Z + 2022-07-16T19:49:34Z + 2022-07-16T19:49:39Z + 2022-07-16T19:49:44Z + 2022-07-16T19:49:49Z + 2022-07-16T19:49:54Z + 2022-07-16T19:49:59Z + 2022-07-16T19:50:04Z + 2022-07-16T19:50:09Z + 2022-07-16T19:50:14Z + 2022-07-16T19:50:19Z + 2022-07-16T19:50:24Z + 2022-07-16T19:50:29Z + 2022-07-16T19:50:34Z + 2022-07-16T19:50:40Z + 2022-07-16T19:50:45Z + 2022-07-16T19:50:50Z + 2022-07-16T19:50:55Z + 2022-07-16T19:51:00Z + 2022-07-16T19:51:05Z + 2022-07-16T19:51:10Z + 2022-07-16T19:51:15Z + 2022-07-16T19:51:20Z + 2022-07-16T19:51:25Z + 2022-07-16T19:51:30Z + 2022-07-16T19:51:35Z + 2022-07-16T19:51:40Z + 2022-07-16T19:51:45Z + 2022-07-16T19:51:50Z + 2022-07-16T19:51:55Z + 2022-07-16T19:52:00Z + 2022-07-16T19:52:05Z + 2022-07-16T19:52:10Z + 2022-07-16T19:52:15Z + 2022-07-16T19:52:20Z + 2022-07-16T19:52:25Z + 2022-07-16T19:52:30Z + 2022-07-16T19:52:35Z + 2022-07-16T19:52:40Z + 2022-07-16T19:52:45Z + 2022-07-16T19:52:50Z + 2022-07-16T19:52:55Z + 2022-07-16T19:53:00Z + 2022-07-16T19:53:05Z + 2022-07-16T19:53:10Z + 2022-07-16T19:53:15Z + 2022-07-16T19:53:20Z + 2022-07-16T19:53:25Z + 2022-07-16T19:53:30Z + 2022-07-16T19:53:35Z + 2022-07-16T19:53:40Z + 2022-07-16T19:53:45Z + 2022-07-16T19:53:50Z + 2022-07-16T19:53:55Z + 2022-07-16T19:54:00Z + 2022-07-16T19:54:05Z + 2022-07-16T19:54:11Z + 2022-07-16T19:54:16Z + 2022-07-16T19:54:21Z + 2022-07-16T19:54:26Z + 2022-07-16T19:54:31Z + 2022-07-16T19:54:36Z + 2022-07-16T19:54:41Z + 2022-07-16T19:54:46Z + 2022-07-16T19:54:51Z + 2022-07-16T19:54:56Z + 2022-07-16T19:55:01Z + 2022-07-16T19:55:06Z + 2022-07-16T19:55:11Z + 2022-07-16T19:55:16Z + 2022-07-16T19:55:21Z + 2022-07-16T19:55:26Z + 2022-07-16T19:55:31Z + 2022-07-16T19:55:36Z + 2022-07-16T19:55:41Z + 2022-07-16T19:55:46Z + 2022-07-16T19:55:51Z + 2022-07-16T19:55:56Z + 2022-07-16T19:56:01Z + 2022-07-16T19:56:06Z + 2022-07-16T19:56:11Z + 2022-07-16T19:56:16Z + 2022-07-16T19:56:21Z + 2022-07-16T19:56:26Z + 2022-07-16T19:56:31Z + 2022-07-16T19:56:36Z + 2022-07-16T19:56:41Z + 2022-07-16T19:56:46Z + 2022-07-16T19:56:51Z + 2022-07-16T19:56:56Z + 2022-07-16T19:57:01Z + 2022-07-16T19:57:06Z + 2022-07-16T19:57:11Z + 2022-07-16T19:57:16Z + 2022-07-16T19:57:21Z + 2022-07-16T19:57:26Z + 2022-07-16T19:57:31Z + 2022-07-16T19:57:36Z + 2022-07-16T19:57:41Z + 2022-07-16T19:57:46Z + 2022-07-16T19:57:51Z + 2022-07-16T19:57:56Z + 2022-07-16T19:58:01Z + 2022-07-16T19:58:06Z + 2022-07-16T19:58:11Z + 2022-07-16T19:58:16Z + 2022-07-16T19:58:21Z + 2022-07-16T19:58:26Z + 2022-07-16T19:58:31Z + 2022-07-16T19:58:36Z + 2022-07-16T19:58:41Z + 2022-07-16T19:58:46Z + 2022-07-16T19:58:51Z + 2022-07-16T19:58:56Z + 2022-07-16T19:59:01Z + 2022-07-16T19:59:06Z + 2022-07-16T19:59:11Z + 2022-07-16T19:59:16Z + 2022-07-16T19:59:21Z + 2022-07-16T19:59:26Z + 2022-07-16T19:59:31Z + 2022-07-16T19:59:36Z + 2022-07-16T19:59:41Z + 2022-07-16T19:59:46Z + 2022-07-16T19:59:51Z + 2022-07-16T19:59:56Z + 2022-07-16T20:00:01Z + 2022-07-16T20:00:06Z + 2022-07-16T20:00:11Z + 2022-07-16T20:00:16Z + 2022-07-16T20:00:21Z + 2022-07-16T20:00:26Z + 2022-07-16T20:00:31Z + 2022-07-16T20:00:36Z + 2022-07-16T20:00:41Z + 2022-07-16T20:00:46Z + 2022-07-16T20:00:51Z + 2022-07-16T20:00:56Z + 2022-07-16T20:01:01Z + 2022-07-16T20:01:06Z + 2022-07-16T20:01:11Z + 2022-07-16T20:01:16Z + 2022-07-16T20:01:21Z + 2022-07-16T20:01:26Z + 2022-07-16T20:01:31Z + 2022-07-16T20:01:36Z + 2022-07-16T20:01:41Z + 2022-07-16T20:01:46Z + 2022-07-16T20:01:51Z + 2022-07-16T20:01:56Z + 2022-07-16T20:02:01Z + 2022-07-16T20:02:06Z + 2022-07-16T20:02:11Z + 2022-07-16T20:02:16Z + 2022-07-16T20:02:21Z + 2022-07-16T20:02:26Z + 2022-07-16T20:02:31Z + 2022-07-16T20:02:36Z + 2022-07-16T20:02:41Z + 2022-07-16T20:02:46Z + 2022-07-16T20:02:51Z + 2022-07-16T20:02:56Z + 2022-07-16T20:03:01Z + 2022-07-16T20:03:06Z + 2022-07-16T20:03:11Z + 2022-07-16T20:03:16Z + 2022-07-16T20:03:22Z + 2022-07-16T20:03:27Z + 2022-07-16T20:03:32Z + 2022-07-16T20:03:37Z + 2022-07-16T20:03:42Z + 2022-07-16T20:03:47Z + 2022-07-16T20:03:52Z + 2022-07-16T20:03:57Z + 2022-07-16T20:04:02Z + 2022-07-16T20:04:07Z + 2022-07-16T20:04:12Z + 2022-07-16T20:04:17Z + 2022-07-16T20:04:22Z + 2022-07-16T20:04:27Z + 2022-07-16T20:04:32Z + 2022-07-16T20:04:37Z + 2022-07-16T20:04:42Z + 2022-07-16T20:04:47Z + 2022-07-16T20:04:52Z + 2022-07-16T20:04:57Z + 2022-07-16T20:05:02Z + 2022-07-16T20:05:07Z + 2022-07-16T20:05:12Z + 2022-07-16T20:05:17Z + 2022-07-16T20:05:22Z + 2022-07-16T20:05:27Z + 2022-07-16T20:05:32Z + 2022-07-16T20:05:37Z + 2022-07-16T20:05:42Z + 2022-07-16T20:05:47Z + 2022-07-16T20:05:52Z + 2022-07-16T20:05:57Z + 2022-07-16T20:06:02Z + 2022-07-16T20:06:07Z + 2022-07-16T20:06:12Z + 2022-07-16T20:06:17Z + 2022-07-16T20:06:22Z + 2022-07-16T20:06:27Z + 2022-07-16T20:06:32Z + 2022-07-16T20:06:37Z + 2022-07-16T20:06:42Z + 2022-07-16T20:06:47Z + 2022-07-16T20:06:52Z + 2022-07-16T20:06:57Z + 2022-07-16T20:07:02Z + 2022-07-16T20:07:07Z + 2022-07-16T20:07:12Z + 2022-07-16T20:07:17Z + 2022-07-16T20:07:22Z + 2022-07-16T20:07:27Z + 2022-07-16T20:07:32Z + 2022-07-16T20:07:37Z + 2022-07-16T20:07:42Z + 2022-07-16T20:07:47Z + 2022-07-16T20:07:52Z + 2022-07-16T20:07:57Z + 2022-07-16T20:08:02Z + 2022-07-16T20:08:07Z + 2022-07-16T20:08:12Z + 2022-07-16T20:08:17Z + 2022-07-16T20:08:22Z + 2022-07-16T20:08:27Z + 2022-07-16T20:08:32Z + 2022-07-16T20:08:37Z + 2022-07-16T20:08:42Z + 2022-07-16T20:08:47Z + 2022-07-16T20:08:52Z + 2022-07-16T20:08:57Z + 2022-07-16T20:09:02Z + 2022-07-16T20:09:07Z + 2022-07-16T20:09:12Z + 2022-07-16T20:09:17Z + 2022-07-16T20:09:22Z + 2022-07-16T20:09:27Z + 2022-07-16T20:09:32Z + 2022-07-16T20:09:37Z + 2022-07-16T20:09:42Z + 2022-07-16T20:09:47Z + 2022-07-16T20:09:52Z + 2022-07-16T20:09:57Z + 2022-07-16T20:10:02Z + 2022-07-16T20:10:07Z + 2022-07-16T20:10:12Z + 2022-07-16T20:10:17Z + 2022-07-16T20:10:22Z + 2022-07-16T20:10:27Z + 2022-07-16T20:10:32Z + 2022-07-16T20:10:37Z + 2022-07-16T20:10:42Z + 2022-07-16T20:10:47Z + 2022-07-16T20:10:52Z + 2022-07-16T20:10:57Z + 2022-07-16T20:11:02Z + 2022-07-16T20:11:07Z + 2022-07-16T20:11:12Z + 2022-07-16T20:11:17Z + 2022-07-16T20:11:22Z + 2022-07-16T20:11:27Z + 2022-07-16T20:11:32Z + 2022-07-16T20:11:37Z + 2022-07-16T20:11:42Z + 2022-07-16T20:11:47Z + 2022-07-16T20:11:52Z + 2022-07-16T20:11:57Z + 2022-07-16T20:12:02Z + 2022-07-16T20:12:07Z + 2022-07-16T20:12:12Z + 2022-07-16T20:12:17Z + 2022-07-16T20:12:22Z + 2022-07-16T20:12:27Z + 2022-07-16T20:12:32Z + 2022-07-16T20:12:37Z + 2022-07-16T20:12:42Z + 2022-07-16T20:12:47Z + 2022-07-16T20:12:52Z + 2022-07-16T20:12:57Z + 2022-07-16T20:13:02Z + 2022-07-16T20:13:07Z + 2022-07-16T20:13:12Z + 2022-07-16T20:13:17Z + 2022-07-16T20:13:22Z + 2022-07-16T20:13:27Z + 2022-07-16T20:13:32Z + 2022-07-16T20:13:37Z + 2022-07-16T20:13:42Z + 2022-07-16T20:13:47Z + 2022-07-16T20:13:52Z + 2022-07-16T20:13:57Z + 2022-07-16T20:14:02Z + 2022-07-16T20:14:07Z + 2022-07-16T20:14:12Z + 2022-07-16T20:14:17Z + 2022-07-16T20:14:22Z + 2022-07-16T20:14:27Z + 2022-07-16T20:14:32Z + 2022-07-16T20:14:37Z + 2022-07-16T20:14:42Z + 2022-07-16T20:14:47Z + 2022-07-16T20:14:52Z + 2022-07-16T20:14:57Z + 2022-07-16T20:15:02Z + 2022-07-16T20:15:07Z + 2022-07-16T20:15:12Z + 2022-07-16T20:15:17Z + 2022-07-16T20:15:22Z + 2022-07-16T20:15:27Z + 2022-07-16T20:15:32Z + 2022-07-16T20:15:37Z + 2022-07-16T20:15:42Z + 2022-07-16T20:15:47Z + 2022-07-16T20:15:52Z + 2022-07-16T20:15:57Z + 2022-07-16T20:16:02Z + 2022-07-16T20:16:07Z + 2022-07-16T20:16:12Z + 2022-07-16T20:16:17Z + 2022-07-16T20:16:22Z + 2022-07-16T20:16:27Z + 2022-07-16T20:16:33Z + 2022-07-16T20:16:38Z + 2022-07-16T20:16:43Z + 2022-07-16T20:16:48Z + 2022-07-16T20:16:53Z + 2022-07-16T20:16:58Z + 2022-07-16T20:17:03Z + 2022-07-16T20:17:08Z + 2022-07-16T20:17:13Z + 2022-07-16T20:17:18Z + 2022-07-16T20:17:23Z + 2022-07-16T20:17:28Z + 2022-07-16T20:17:33Z + 2022-07-16T20:17:38Z + 2022-07-16T20:17:43Z + 2022-07-16T20:17:48Z + 2022-07-16T20:17:53Z + 2022-07-16T20:17:58Z + 2022-07-16T20:18:03Z + 2022-07-16T20:18:08Z + 2022-07-16T20:18:13Z + 2022-07-16T20:18:18Z + 2022-07-16T20:18:23Z + 2022-07-16T20:18:28Z + 2022-07-16T20:18:33Z + 2022-07-16T20:18:38Z + 2022-07-16T20:18:43Z + 2022-07-16T20:18:48Z + 2022-07-16T20:18:53Z + 2022-07-16T20:18:58Z + 2022-07-16T20:19:03Z + 2022-07-16T20:19:08Z + 2022-07-16T20:19:13Z + 2022-07-16T20:19:18Z + 2022-07-16T20:19:23Z + 2022-07-16T20:19:28Z + 2022-07-16T20:19:33Z + 2022-07-16T20:19:38Z + 2022-07-16T20:19:43Z + 2022-07-16T20:19:48Z + 2022-07-16T20:19:53Z + 2022-07-16T20:19:58Z + 2022-07-16T20:20:03Z + 2022-07-16T20:20:08Z + 2022-07-16T20:20:13Z + 2022-07-16T20:20:18Z + 2022-07-16T20:20:23Z + 2022-07-16T20:20:28Z + 2022-07-16T20:20:33Z + 2022-07-16T20:20:38Z + 2022-07-16T20:20:43Z + 2022-07-16T20:20:48Z + 2022-07-16T20:20:53Z + 2022-07-16T20:20:58Z + 2022-07-16T20:21:03Z + 2022-07-16T20:21:08Z + 2022-07-16T20:21:13Z + 2022-07-16T20:21:18Z + 2022-07-16T20:21:23Z + 2022-07-16T20:21:28Z + 2022-07-16T20:21:33Z + 2022-07-16T20:21:38Z + 2022-07-16T20:21:43Z + 2022-07-16T20:21:48Z + 2022-07-16T20:21:53Z + 2022-07-16T20:21:58Z + 2022-07-16T20:22:03Z + 2022-07-16T20:22:08Z + 2022-07-16T20:22:13Z + 2022-07-16T20:22:18Z + 2022-07-16T20:22:23Z + 2022-07-16T20:22:28Z + 2022-07-16T20:22:33Z + 2022-07-16T20:22:38Z + 2022-07-16T20:22:43Z + 2022-07-16T20:22:48Z + 2022-07-16T20:22:53Z + 2022-07-16T20:22:58Z + 2022-07-16T20:23:03Z + 2022-07-16T20:23:08Z + 2022-07-16T20:23:13Z + 2022-07-16T20:23:18Z + 2022-07-16T20:23:23Z + 2022-07-16T20:23:28Z + 2022-07-16T20:23:33Z + 2022-07-16T20:23:38Z + 2022-07-16T20:23:43Z + 2022-07-16T20:23:48Z + 2022-07-16T20:23:53Z + 2022-07-16T20:23:58Z + 2022-07-16T20:24:03Z + 2022-07-16T20:24:08Z + 2022-07-16T20:24:13Z + 2022-07-16T20:24:18Z + 2022-07-16T20:24:23Z + 2022-07-16T20:24:28Z + 2022-07-16T20:24:33Z + 2022-07-16T20:24:38Z + 2022-07-16T20:24:43Z + 2022-07-16T20:24:48Z + 2022-07-16T20:24:53Z + 2022-07-16T20:24:58Z + 2022-07-16T20:25:03Z + 2022-07-16T20:25:08Z + 2022-07-16T20:25:13Z + 2022-07-16T20:25:18Z + 2022-07-16T20:25:23Z + 2022-07-16T20:25:28Z + 2022-07-16T20:25:33Z + 2022-07-16T20:25:38Z + 2022-07-16T20:25:43Z + 2022-07-16T20:25:48Z + 2022-07-16T20:25:53Z + 2022-07-16T20:25:58Z + 2022-07-16T20:26:03Z + 2022-07-16T20:26:08Z + 2022-07-16T20:26:13Z + 2022-07-16T20:26:18Z + 2022-07-16T20:26:23Z + 2022-07-16T20:26:28Z + 2022-07-16T20:26:33Z + 2022-07-16T20:26:38Z + 2022-07-16T20:26:43Z + 2022-07-16T20:26:48Z + 2022-07-16T20:26:53Z + 2022-07-16T20:26:58Z + 2022-07-16T20:27:03Z + 2022-07-16T20:27:08Z + 2022-07-16T20:27:13Z + 2022-07-16T20:27:18Z + 2022-07-16T20:27:23Z + 2022-07-16T20:27:28Z + 2022-07-16T20:27:33Z + 2022-07-16T20:27:38Z + 2022-07-16T20:27:43Z + 2022-07-16T20:27:48Z + 2022-07-16T20:27:53Z + 2022-07-16T20:27:58Z + 2022-07-16T20:28:03Z + 2022-07-16T20:28:08Z + 2022-07-16T20:28:13Z + 2022-07-16T20:28:18Z + 2022-07-16T20:28:23Z + 2022-07-16T20:28:28Z + 2022-07-16T20:28:33Z + 2022-07-16T20:28:38Z + 2022-07-16T20:28:43Z + 2022-07-16T20:28:48Z + 2022-07-16T20:28:53Z + 2022-07-16T20:28:58Z + 2022-07-16T20:29:03Z + 2022-07-16T20:29:09Z + 2022-07-16T20:29:13Z + 2022-07-16T20:29:19Z + 2022-07-16T20:29:24Z + 2022-07-16T20:29:29Z + 2022-07-16T20:29:34Z + 2022-07-16T20:29:39Z + 2022-07-16T20:29:44Z + 2022-07-16T20:29:49Z + 2022-07-16T20:29:54Z + 2022-07-16T20:29:59Z + 2022-07-16T20:30:04Z + 2022-07-16T20:30:09Z + 2022-07-16T20:30:14Z + 2022-07-16T20:30:19Z + 2022-07-16T20:30:24Z + 2022-07-16T20:30:29Z + 2022-07-16T20:30:34Z + 2022-07-16T20:30:39Z + 2022-07-16T20:30:44Z + 2022-07-16T20:30:49Z + 2022-07-16T20:30:54Z + 2022-07-16T20:30:59Z + 2022-07-16T20:31:04Z + 2022-07-16T20:31:09Z + 2022-07-16T20:31:14Z + 2022-07-16T20:31:19Z + 2022-07-16T20:31:24Z + 2022-07-16T20:31:29Z + 2022-07-16T20:31:34Z + 2022-07-16T20:31:39Z + 2022-07-16T20:31:44Z + 2022-07-16T20:31:49Z + 2022-07-16T20:31:54Z + 2022-07-16T20:31:59Z + 2022-07-16T20:32:04Z + 2022-07-16T20:32:09Z + 2022-07-16T20:32:14Z + 2022-07-16T20:32:19Z + 2022-07-16T20:32:24Z + 2022-07-16T20:32:29Z + 2022-07-16T20:32:34Z + 2022-07-16T20:32:39Z + 2022-07-16T20:32:44Z + 2022-07-16T20:32:49Z + 2022-07-16T20:32:54Z + 2022-07-16T20:32:59Z + 2022-07-16T20:33:04Z + 2022-07-16T20:33:09Z + 2022-07-16T20:33:14Z + 2022-07-16T20:33:19Z + 2022-07-16T20:33:24Z + 2022-07-16T20:33:29Z + 2022-07-16T20:33:34Z + 2022-07-16T20:33:39Z + 2022-07-16T20:33:44Z + 2022-07-16T20:33:49Z + 2022-07-16T20:33:54Z + 2022-07-16T20:33:59Z + 2022-07-16T20:34:04Z + 2022-07-16T20:34:09Z + 2022-07-16T20:34:14Z + 2022-07-16T20:34:19Z + 2022-07-16T20:34:24Z + 2022-07-16T20:34:29Z + 2022-07-16T20:34:34Z + 2022-07-16T20:34:39Z + 2022-07-16T20:34:44Z + 2022-07-16T20:34:49Z + 2022-07-16T20:34:54Z + 2022-07-16T20:34:59Z + 2022-07-16T20:35:04Z + 2022-07-16T20:35:09Z + 2022-07-16T20:35:14Z + 2022-07-16T20:35:19Z + 2022-07-16T20:35:24Z + 2022-07-16T20:35:29Z + 2022-07-16T20:35:34Z + 2022-07-16T20:35:39Z + 2022-07-16T20:35:44Z + 2022-07-16T20:35:49Z + 2022-07-16T20:35:54Z + 2022-07-16T20:35:59Z + 2022-07-16T20:36:04Z + 2022-07-16T20:36:09Z + 2022-07-16T20:36:14Z + 2022-07-16T20:36:19Z + 2022-07-16T20:36:24Z + 2022-07-16T20:36:29Z + 2022-07-16T20:36:34Z + 2022-07-16T20:36:39Z + 2022-07-16T20:36:44Z + 2022-07-16T20:36:49Z + 2022-07-16T20:36:54Z + 2022-07-16T20:36:59Z + 2022-07-16T20:37:04Z + 2022-07-16T20:37:09Z + 2022-07-16T20:37:14Z + 2022-07-16T20:37:19Z + 2022-07-16T20:37:24Z + 2022-07-16T20:37:29Z + 2022-07-16T20:37:34Z + 2022-07-16T20:37:39Z + 2022-07-16T20:37:44Z + 2022-07-16T20:37:49Z + 2022-07-16T20:37:54Z + 2022-07-16T20:37:59Z + 2022-07-16T20:38:04Z + 2022-07-16T20:38:09Z + 2022-07-16T20:38:14Z + 2022-07-16T20:38:19Z + 2022-07-16T20:38:24Z + 2022-07-16T20:38:29Z + 2022-07-16T20:38:34Z + 2022-07-16T20:38:39Z + 2022-07-16T20:38:44Z + 2022-07-16T20:38:49Z + 2022-07-16T20:38:54Z + 2022-07-16T20:38:59Z + 2022-07-16T20:39:05Z + 2022-07-16T20:39:10Z + 2022-07-16T20:39:15Z + 2022-07-16T20:39:20Z + 2022-07-16T20:39:25Z + 2022-07-16T20:39:30Z + 2022-07-16T20:39:35Z + 2022-07-16T20:39:40Z + 2022-07-16T20:39:45Z + 2022-07-16T20:39:50Z + 2022-07-16T20:39:55Z + 2022-07-16T20:40:00Z + 2022-07-16T20:40:05Z + 2022-07-16T20:40:10Z + 2022-07-16T20:40:15Z + 2022-07-16T20:40:20Z + 2022-07-16T20:40:25Z + 2022-07-16T20:40:30Z + 2022-07-16T20:40:35Z + 2022-07-16T20:40:40Z + 2022-07-16T20:40:45Z + 2022-07-16T20:40:50Z + 2022-07-16T20:40:55Z + 2022-07-16T20:41:00Z + 2022-07-16T20:41:05Z + 2022-07-16T20:41:10Z + 2022-07-16T20:41:15Z + 2022-07-16T20:41:20Z + 2022-07-16T20:41:25Z + 2022-07-16T20:41:30Z + 2022-07-16T20:41:35Z + 2022-07-16T20:41:40Z + 2022-07-16T20:41:45Z + 2022-07-16T20:41:50Z + 2022-07-16T20:41:55Z + 2022-07-16T20:42:00Z + 2022-07-16T20:42:05Z + 2022-07-16T20:42:10Z + 2022-07-16T20:42:15Z + 2022-07-16T20:42:20Z + 2022-07-16T20:42:25Z + 2022-07-16T20:42:30Z + 2022-07-16T20:42:35Z + 2022-07-16T20:42:40Z + 2022-07-16T20:42:45Z + 2022-07-16T20:42:50Z + 2022-07-16T20:42:55Z + 2022-07-16T20:43:00Z + 2022-07-16T20:43:05Z + 2022-07-16T20:43:10Z + 2022-07-16T20:43:15Z + 2022-07-16T20:43:20Z + 2022-07-16T20:43:25Z + 2022-07-16T20:43:30Z + 2022-07-16T20:43:35Z + 2022-07-16T20:43:40Z + 2022-07-16T20:43:45Z + 2022-07-16T20:43:50Z + 2022-07-16T20:43:55Z + 2022-07-16T20:44:00Z + 2022-07-16T20:44:05Z + 2022-07-16T20:44:10Z + 2022-07-16T20:44:15Z + 2022-07-16T20:44:20Z + 2022-07-16T20:44:25Z + 2022-07-16T20:44:30Z + 2022-07-16T20:44:35Z + 2022-07-16T20:44:40Z + 2022-07-16T20:44:45Z + 2022-07-16T20:44:50Z + 2022-07-16T20:44:55Z + 2022-07-16T20:45:00Z + 2022-07-16T20:45:05Z + 2022-07-16T20:45:10Z + 2022-07-16T20:45:15Z + 2022-07-16T20:45:20Z + 2022-07-16T20:45:25Z + 2022-07-16T20:45:30Z + 2022-07-16T20:45:35Z + 2022-07-16T20:45:40Z + 2022-07-16T20:45:45Z + 2022-07-16T20:45:50Z + 2022-07-16T20:45:55Z + 2022-07-16T20:46:00Z + 2022-07-16T20:46:05Z + 2022-07-16T20:46:10Z + 2022-07-16T20:46:15Z + 2022-07-16T20:46:20Z + 2022-07-16T20:46:25Z + 2022-07-16T20:46:30Z + 2022-07-16T20:46:35Z + 2022-07-16T20:46:40Z + 2022-07-16T20:46:45Z + 2022-07-16T20:46:50Z + 2022-07-16T20:46:55Z + 2022-07-16T20:47:00Z + 2022-07-16T20:47:05Z + 2022-07-16T20:47:10Z + 2022-07-16T20:47:15Z + 2022-07-16T20:47:20Z + 2022-07-16T20:47:25Z + 2022-07-16T20:47:30Z + 2022-07-16T20:47:35Z + 2022-07-16T20:47:40Z + 2022-07-16T20:47:45Z + 2022-07-16T20:47:50Z + 2022-07-16T20:47:55Z + 2022-07-16T20:48:00Z + 2022-07-16T20:48:05Z + 2022-07-16T20:48:10Z + 2022-07-16T20:48:15Z + 2022-07-16T20:48:20Z + 2022-07-16T20:48:25Z + 2022-07-16T20:48:30Z + 2022-07-16T20:48:35Z + 2022-07-16T20:48:40Z + 2022-07-16T20:48:45Z + 2022-07-16T20:48:50Z + 2022-07-16T20:48:55Z + 2022-07-16T20:49:00Z + 2022-07-16T20:49:05Z + 2022-07-16T20:49:10Z + 2022-07-16T20:49:15Z + 2022-07-16T20:49:20Z + 2022-07-16T20:49:25Z + 2022-07-16T20:49:31Z + 2022-07-16T20:49:36Z + 2022-07-16T20:49:41Z + 2022-07-16T20:49:46Z + 2022-07-16T20:49:51Z + 2022-07-16T20:49:56Z + 2022-07-16T20:50:01Z + 2022-07-16T20:50:06Z + 2022-07-16T20:50:11Z + 2022-07-16T20:50:16Z + 2022-07-16T20:50:21Z + 2022-07-16T20:50:26Z + 2022-07-16T20:50:31Z + 2022-07-16T20:50:36Z + 2022-07-16T20:50:41Z + 2022-07-16T20:50:46Z + 2022-07-16T20:50:51Z + 2022-07-16T20:50:56Z + 2022-07-16T20:51:01Z + 2022-07-16T20:51:06Z + 2022-07-16T20:51:11Z + 2022-07-16T20:51:16Z + 2022-07-16T20:51:21Z + 2022-07-16T20:51:26Z + 2022-07-16T20:51:31Z + 2022-07-16T20:51:36Z + 2022-07-16T20:51:41Z + 2022-07-16T20:51:46Z + 2022-07-16T20:51:51Z + 2022-07-16T20:51:56Z + 2022-07-16T20:52:01Z + 2022-07-16T20:52:06Z + 2022-07-16T20:52:11Z + 2022-07-16T20:52:16Z + 2022-07-16T20:52:21Z + 2022-07-16T20:52:26Z + 2022-07-16T20:52:31Z + 2022-07-16T20:52:36Z + 2022-07-16T20:52:41Z + 2022-07-16T20:52:46Z + 2022-07-16T20:52:51Z + 2022-07-16T20:52:56Z + 2022-07-16T20:53:01Z + 2022-07-16T20:53:06Z + 2022-07-16T20:53:11Z + 2022-07-16T20:53:16Z + 2022-07-16T20:53:21Z + 2022-07-16T20:53:26Z + 2022-07-16T20:53:31Z + 2022-07-16T20:53:36Z + 2022-07-16T20:53:41Z + 2022-07-16T20:53:46Z + 2022-07-16T20:53:51Z + 2022-07-16T20:53:56Z + 2022-07-16T20:54:01Z + 2022-07-16T20:54:06Z + 2022-07-16T20:54:11Z + 2022-07-16T20:54:16Z + 2022-07-16T20:54:21Z + 2022-07-16T20:54:26Z + 2022-07-16T20:54:31Z + 2022-07-16T20:54:36Z + 2022-07-16T20:54:41Z + 2022-07-16T20:54:46Z + 2022-07-16T20:54:51Z + 2022-07-16T20:54:56Z + 2022-07-16T20:55:01Z + 2022-07-16T20:55:06Z + 2022-07-16T20:55:11Z + 2022-07-16T20:55:16Z + 2022-07-16T20:55:21Z + 2022-07-16T20:55:26Z + 2022-07-16T20:55:31Z + 2022-07-16T20:55:36Z + 2022-07-16T20:55:41Z + 2022-07-16T20:55:46Z + 2022-07-16T20:55:51Z + 2022-07-16T20:55:56Z + 2022-07-16T20:56:01Z + 2022-07-16T20:56:06Z + 2022-07-16T20:56:11Z + 2022-07-16T20:56:16Z + 2022-07-16T20:56:21Z + 2022-07-16T20:56:26Z + 2022-07-16T20:56:31Z + 2022-07-16T20:56:36Z + 2022-07-16T20:56:41Z + 2022-07-16T20:56:46Z + 2022-07-16T20:56:51Z + 2022-07-16T20:56:56Z + 2022-07-16T20:57:01Z + 2022-07-16T20:57:06Z + 2022-07-16T20:57:11Z + 2022-07-16T20:57:16Z + 2022-07-16T20:57:21Z + 2022-07-16T20:57:26Z + 2022-07-16T20:57:31Z + 2022-07-16T20:57:36Z + 2022-07-16T20:57:41Z + 2022-07-16T20:57:46Z + 2022-07-16T20:57:51Z + 2022-07-16T20:57:56Z + 2022-07-16T20:58:01Z + 2022-07-16T20:58:06Z + 2022-07-16T20:58:11Z + 2022-07-16T20:58:16Z + 2022-07-16T20:58:21Z + 2022-07-16T20:58:26Z + 2022-07-16T20:58:31Z + 2022-07-16T20:58:36Z + 2022-07-16T20:58:41Z + 2022-07-16T20:58:46Z + 2022-07-16T20:58:51Z + 2022-07-16T20:58:56Z + 2022-07-16T20:59:01Z + 2022-07-16T20:59:06Z + 2022-07-16T20:59:11Z + 2022-07-16T20:59:16Z + 2022-07-16T20:59:21Z + 2022-07-16T20:59:26Z + 2022-07-16T20:59:31Z + 2022-07-16T20:59:36Z + 2022-07-16T20:59:41Z + 2022-07-16T20:59:46Z + 2022-07-16T20:59:51Z + 2022-07-16T20:59:56Z + 2022-07-16T21:00:01Z + 2022-07-16T21:00:06Z + 2022-07-16T21:00:11Z + 2022-07-16T21:00:16Z + 2022-07-16T21:00:21Z + 2022-07-16T21:00:26Z + 2022-07-16T21:00:32Z + 2022-07-16T21:00:37Z + 2022-07-16T21:00:42Z + 2022-07-16T21:00:47Z + 2022-07-16T21:00:52Z + 2022-07-16T21:00:57Z + 2022-07-16T21:01:02Z + 2022-07-16T21:01:07Z + 2022-07-16T21:01:12Z + 2022-07-16T21:01:17Z + 2022-07-16T21:01:22Z + 2022-07-16T21:01:27Z + 2022-07-16T21:01:32Z + 2022-07-16T21:01:37Z + 2022-07-16T21:01:42Z + 2022-07-16T21:01:47Z + 2022-07-16T21:01:52Z + 2022-07-16T21:01:57Z + 2022-07-16T21:02:02Z + 2022-07-16T21:02:07Z + 2022-07-16T21:02:12Z + 2022-07-16T21:02:17Z + 2022-07-16T21:02:22Z + 2022-07-16T21:02:27Z + 2022-07-16T21:02:32Z + 2022-07-16T21:02:37Z + 2022-07-16T21:02:42Z + 2022-07-16T21:02:47Z + 2022-07-16T21:02:52Z + 2022-07-16T21:02:57Z + 2022-07-16T21:03:02Z + 2022-07-16T21:03:07Z + 2022-07-16T21:03:12Z + 2022-07-16T21:03:17Z + 2022-07-16T21:03:22Z + 2022-07-16T21:03:27Z + 2022-07-16T21:03:32Z + 2022-07-16T21:03:37Z + 2022-07-16T21:03:42Z + 2022-07-16T21:03:47Z + 2022-07-16T21:03:52Z + 2022-07-16T21:03:57Z + 2022-07-16T21:04:02Z + 2022-07-16T21:04:07Z + 2022-07-16T21:04:12Z + 2022-07-16T21:04:17Z + 2022-07-16T21:04:22Z + 2022-07-16T21:04:27Z + 2022-07-16T21:04:32Z + 2022-07-16T21:04:37Z + 2022-07-16T21:04:42Z + 2022-07-16T21:04:47Z + 2022-07-16T21:04:52Z + 2022-07-16T21:04:57Z + 2022-07-16T21:05:02Z + 2022-07-16T21:05:07Z + 2022-07-16T21:05:12Z + 2022-07-16T21:05:17Z + 2022-07-16T21:05:22Z + 2022-07-16T21:05:28Z + 2022-07-16T21:05:33Z + 2022-07-16T21:05:38Z + 2022-07-16T21:05:43Z + 2022-07-16T21:05:48Z + 2022-07-16T21:05:53Z + 2022-07-16T21:05:58Z + 2022-07-16T21:06:03Z + 2022-07-16T21:06:08Z + 2022-07-16T21:06:13Z + 2022-07-16T21:06:18Z + 2022-07-16T21:06:23Z + 2022-07-16T21:06:28Z + 2022-07-16T21:06:33Z + 2022-07-16T21:06:38Z + 2022-07-16T21:06:43Z + 2022-07-16T21:06:48Z + 2022-07-16T21:06:53Z + 2022-07-16T21:06:58Z + 2022-07-16T21:07:03Z + 2022-07-16T21:07:08Z + 2022-07-16T21:07:13Z + 2022-07-16T21:07:19Z + 2022-07-16T21:07:24Z + 2022-07-16T21:07:28Z + 2022-07-16T21:07:34Z + 2022-07-16T21:07:39Z + 2022-07-16T21:07:44Z + 2022-07-16T21:07:49Z + 2022-07-16T21:07:54Z + 2022-07-16T21:07:59Z + 2022-07-16T21:08:04Z + 2022-07-16T21:08:09Z + 2022-07-16T21:08:14Z + 2022-07-16T21:08:19Z + 2022-07-16T21:08:24Z + 2022-07-16T21:08:29Z + 2022-07-16T21:08:34Z + 2022-07-16T21:08:39Z + 2022-07-16T21:08:44Z + 2022-07-16T21:08:49Z + 2022-07-16T21:08:54Z + 2022-07-16T21:08:59Z + 2022-07-16T21:09:04Z + 2022-07-16T21:09:09Z + 2022-07-16T21:09:14Z + 2022-07-16T21:09:19Z + 2022-07-16T21:09:24Z + 2022-07-16T21:09:29Z + 2022-07-16T21:09:34Z + 2022-07-16T21:09:39Z + 2022-07-16T21:09:44Z + 2022-07-16T21:09:49Z + 2022-07-16T21:09:54Z + 2022-07-16T21:10:00Z + 2022-07-16T21:10:05Z + 2022-07-16T21:10:10Z + 2022-07-16T21:10:15Z + 2022-07-16T21:10:20Z + 2022-07-16T21:10:25Z + 2022-07-16T21:10:30Z + 2022-07-16T21:10:35Z + 2022-07-16T21:10:40Z + 2022-07-16T21:10:45Z + 2022-07-16T21:10:50Z + 2022-07-16T21:10:55Z + 2022-07-16T21:11:00Z + 2022-07-16T21:11:05Z + 2022-07-16T21:11:10Z + 2022-07-16T21:11:15Z + 2022-07-16T21:11:20Z + -80.443083 43.840333 438.00 + -80.443083 43.840333 438.00 + -80.443083 43.840333 438.00 + -80.442617 43.839933 438.00 + -80.441667 43.839200 439.00 + -80.440567 43.838433 439.00 + -80.439233 43.837517 442.00 + -80.437850 43.836533 460.00 + -80.436450 43.835600 476.00 + -80.435117 43.834700 498.00 + -80.433833 43.833833 515.00 + -80.432483 43.833000 527.00 + -80.431400 43.832050 543.00 + -80.430767 43.830933 551.00 + -80.430767 43.829700 558.00 + -80.431133 43.828533 569.00 + -80.431967 43.827483 572.00 + -80.433300 43.826650 587.00 + -80.434950 43.826117 598.00 + -80.436800 43.825667 613.00 + -80.438317 43.825250 630.00 + -80.440050 43.825017 645.00 + -80.441817 43.825250 653.00 + -80.443417 43.825967 658.00 + -80.444700 43.827117 664.00 + -80.445300 43.828633 674.00 + -80.445100 43.830217 693.00 + -80.444250 43.831683 701.00 + -80.442550 43.832883 707.00 + -80.440667 43.833500 716.00 + -80.438600 43.833683 723.00 + -80.436650 43.833267 731.00 + -80.435117 43.832383 738.00 + -80.434150 43.831200 747.00 + -80.433833 43.829900 760.00 + -80.434267 43.828650 770.00 + -80.435350 43.827617 784.00 + -80.436817 43.826950 810.00 + -80.438400 43.826483 822.00 + -80.439983 43.826083 832.00 + -80.441567 43.825700 842.00 + -80.443217 43.825317 850.00 + -80.444850 43.824883 870.00 + -80.446267 43.824200 887.00 + -80.447117 43.823100 905.00 + -80.447167 43.821850 922.00 + -80.446417 43.820617 924.00 + -80.444900 43.819717 929.00 + -80.442883 43.819250 938.00 + -80.440683 43.819350 953.00 + -80.438333 43.820033 962.00 + -80.436700 43.821067 973.00 + -80.434900 43.822217 992.00 + -80.432783 43.822983 1004.00 + -80.430450 43.823183 1014.00 + -80.428217 43.822950 1027.00 + -80.426083 43.822233 1042.00 + -80.424683 43.821150 1058.00 + -80.423833 43.819800 1067.00 + -80.423767 43.818350 1077.00 + -80.424400 43.817033 1096.00 + -80.425667 43.816033 1102.00 + -80.427400 43.815400 1110.00 + -80.429400 43.815200 1120.00 + -80.431450 43.815367 1136.00 + -80.433483 43.815633 1154.00 + -80.435483 43.815517 1174.00 + -80.437300 43.814950 1194.00 + -80.438550 43.813850 1217.00 + -80.438850 43.812467 1236.00 + -80.438283 43.811150 1262.00 + -80.437033 43.810083 1288.00 + -80.435283 43.809367 1316.00 + -80.432900 43.809350 1327.00 + -80.430750 43.809950 1342.00 + -80.429117 43.809300 1347.00 + -80.427983 43.808300 1348.00 + -80.427067 43.807283 1346.00 + -80.425767 43.806633 1341.00 + -80.424533 43.807233 1336.00 + -80.424433 43.808267 1333.00 + -80.425217 43.809133 1330.00 + -80.426517 43.809633 1328.00 + -80.428017 43.809800 1328.00 + -80.429567 43.809767 1320.00 + -80.431083 43.809567 1319.00 + -80.432583 43.809317 1325.00 + -80.434083 43.808967 1336.00 + -80.434733 43.808067 1349.00 + -80.433900 43.807333 1358.00 + -80.432517 43.807600 1373.00 + -80.431917 43.808567 1383.00 + -80.432533 43.809533 1390.00 + -80.433900 43.809750 1400.00 + -80.434967 43.809000 1408.00 + -80.434883 43.808033 1423.00 + -80.433683 43.807633 1437.00 + -80.432600 43.808233 1454.00 + -80.432683 43.809283 1459.00 + -80.433933 43.809817 1471.00 + -80.435117 43.809400 1485.00 + -80.435283 43.808483 1490.00 + -80.434300 43.807800 1503.00 + -80.432933 43.807950 1522.00 + -80.432150 43.808833 1535.00 + -80.432667 43.809950 1540.00 + -80.434017 43.810300 1555.00 + -80.435250 43.809933 1567.00 + -80.436217 43.809083 1582.00 + -80.435717 43.808200 1591.00 + -80.434367 43.808000 1597.00 + -80.433183 43.808700 1613.00 + -80.433233 43.809800 1632.00 + -80.434617 43.810167 1643.00 + -80.435617 43.809400 1656.00 + -80.435033 43.808533 1666.00 + -80.433600 43.808583 1670.00 + -80.432950 43.809700 1689.00 + -80.433483 43.810800 1703.00 + -80.435017 43.811067 1717.00 + -80.436033 43.810283 1729.00 + -80.435650 43.809317 1738.00 + -80.434000 43.809100 1744.00 + -80.432850 43.809933 1761.00 + -80.432517 43.811067 1777.00 + -80.433733 43.811683 1786.00 + -80.434950 43.811167 1797.00 + -80.434833 43.810183 1809.00 + -80.433483 43.809817 1815.00 + -80.432267 43.810533 1833.00 + -80.432500 43.811567 1848.00 + -80.433817 43.811933 1856.00 + -80.434867 43.811283 1869.00 + -80.434717 43.810367 1881.00 + -80.433517 43.809850 1892.00 + -80.432033 43.810100 1906.00 + -80.431267 43.811050 1910.00 + -80.431600 43.812083 1912.00 + -80.432783 43.812750 1912.00 + -80.434267 43.812533 1919.00 + -80.434917 43.811567 1931.00 + -80.434283 43.810550 1941.00 + -80.432750 43.810283 1961.00 + -80.431500 43.810967 1973.00 + -80.431317 43.812017 1980.00 + -80.432133 43.812850 1981.00 + -80.433450 43.813300 1989.00 + -80.434850 43.813383 2002.00 + -80.435733 43.812700 2004.00 + -80.435333 43.811700 2000.00 + -80.433933 43.811300 2007.00 + -80.432483 43.811700 2024.00 + -80.432167 43.812750 2029.00 + -80.433300 43.813467 2039.00 + -80.434483 43.813100 2049.00 + -80.434733 43.812217 2055.00 + -80.433833 43.811417 2056.00 + -80.432450 43.811633 2076.00 + -80.431950 43.812650 2075.00 + -80.432867 43.813567 2085.00 + -80.434233 43.813417 2100.00 + -80.434767 43.812550 2104.00 + -80.434017 43.811700 2113.00 + -80.432517 43.811800 2125.00 + -80.431917 43.812883 2131.00 + -80.432817 43.813767 2140.00 + -80.434117 43.813517 2152.00 + -80.434300 43.812600 2155.00 + -80.433133 43.812000 2172.00 + -80.431817 43.812517 2176.00 + -80.431600 43.813667 2184.00 + -80.432667 43.814417 2193.00 + -80.433900 43.814017 2200.00 + -80.434000 43.813067 2202.00 + -80.432650 43.812833 2214.00 + -80.431700 43.813650 2213.00 + -80.432317 43.814683 2213.00 + -80.433767 43.815017 2218.00 + -80.435250 43.814850 2216.00 + -80.436467 43.814283 2210.00 + -80.436550 43.813300 2206.00 + -80.435483 43.812550 2216.00 + -80.434117 43.812117 2213.00 + -80.432633 43.812583 2211.00 + -80.432300 43.813750 2220.00 + -80.433433 43.814467 2222.00 + -80.434767 43.814050 2225.00 + -80.434717 43.813033 2234.00 + -80.433383 43.812633 2236.00 + -80.432083 43.813150 2227.00 + -80.432117 43.814433 2226.00 + -80.432550 43.815750 2222.00 + -80.433067 43.817150 2219.00 + -80.433650 43.818650 2219.00 + -80.434467 43.820100 2231.00 + -80.435967 43.820100 2247.00 + -80.436100 43.819167 2243.00 + -80.435233 43.818217 2221.00 + -80.433733 43.817283 2213.00 + -80.432033 43.816450 2211.00 + -80.430167 43.815717 2208.00 + -80.428183 43.815050 2203.00 + -80.426133 43.814483 2197.00 + -80.424017 43.813967 2190.00 + -80.421867 43.813417 2193.00 + -80.420200 43.812900 2222.00 + -80.418750 43.812450 2214.00 + -80.417233 43.811883 2212.00 + -80.415567 43.811367 2201.00 + -80.413683 43.810767 2191.00 + -80.411750 43.810050 2182.00 + -80.409733 43.809367 2173.00 + -80.407667 43.808667 2162.00 + -80.405600 43.807817 2153.00 + -80.403567 43.806883 2148.00 + -80.401533 43.805983 2143.00 + -80.399700 43.805167 2155.00 + -80.397983 43.804483 2148.00 + -80.396000 43.803917 2126.00 + -80.393850 43.803217 2116.00 + -80.391833 43.802383 2112.00 + -80.390033 43.801517 2109.00 + -80.388400 43.800600 2107.00 + -80.386883 43.799633 2101.00 + -80.385317 43.798533 2096.00 + -80.383900 43.797517 2090.00 + -80.382517 43.796450 2089.00 + -80.381283 43.795317 2091.00 + -80.380267 43.794083 2106.00 + -80.379533 43.792983 2118.00 + -80.378967 43.791983 2118.00 + -80.378450 43.790883 2104.00 + -80.377833 43.789633 2092.00 + -80.377183 43.788300 2083.00 + -80.376517 43.786900 2076.00 + -80.375850 43.785467 2060.00 + -80.375217 43.783933 2050.00 + -80.374633 43.782500 2051.00 + -80.374117 43.781100 2044.00 + -80.373717 43.779650 2032.00 + -80.373333 43.778150 2018.00 + -80.373000 43.776583 2004.00 + -80.372633 43.774950 1992.00 + -80.372267 43.773317 1985.00 + -80.371933 43.771733 1985.00 + -80.371617 43.770217 1985.00 + -80.371150 43.768733 1982.00 + -80.370617 43.767300 1978.00 + -80.370033 43.765850 1966.00 + -80.369367 43.764333 1955.00 + -80.368717 43.762750 1942.00 + -80.368050 43.761083 1932.00 + -80.367367 43.759417 1921.00 + -80.366800 43.757733 1917.00 + -80.366283 43.756100 1909.00 + -80.365783 43.754467 1903.00 + -80.365367 43.752833 1895.00 + -80.364917 43.751200 1880.00 + -80.364450 43.749517 1875.00 + -80.363883 43.747783 1870.00 + -80.363350 43.746083 1873.00 + -80.362750 43.744417 1873.00 + -80.362200 43.742750 1873.00 + -80.361567 43.741083 1868.00 + -80.360983 43.739400 1853.00 + -80.360383 43.737667 1845.00 + -80.359733 43.735950 1839.00 + -80.359050 43.734200 1824.00 + -80.358317 43.732417 1815.00 + -80.357617 43.730483 1816.00 + -80.357033 43.728850 1818.00 + -80.356500 43.727217 1811.00 + -80.355983 43.725550 1801.00 + -80.355350 43.723833 1787.00 + -80.354700 43.722133 1773.00 + -80.354083 43.720483 1764.00 + -80.353583 43.718900 1757.00 + -80.353150 43.717333 1749.00 + -80.352650 43.715750 1736.00 + -80.352000 43.714067 1721.00 + -80.351183 43.712400 1717.00 + -80.350367 43.710750 1714.00 + -80.349417 43.709217 1716.00 + -80.348567 43.707833 1730.00 + -80.347850 43.706617 1737.00 + -80.346983 43.705567 1733.00 + -80.346517 43.704450 1729.00 + -80.347133 43.703383 1725.00 + -80.348217 43.702467 1733.00 + -80.349300 43.701550 1732.00 + -80.350450 43.700683 1726.00 + -80.351683 43.699867 1716.00 + -80.352967 43.699033 1704.00 + -80.354367 43.698200 1695.00 + -80.355867 43.697400 1686.00 + -80.357267 43.696533 1684.00 + -80.358633 43.695717 1676.00 + -80.359983 43.694967 1668.00 + -80.361317 43.694167 1660.00 + -80.362583 43.693250 1655.00 + -80.363833 43.692283 1654.00 + -80.365100 43.691367 1659.00 + -80.366250 43.690450 1666.00 + -80.367400 43.689550 1671.00 + -80.368283 43.688550 1681.00 + -80.367300 43.687633 1691.00 + -80.365600 43.687550 1703.00 + -80.364500 43.688450 1714.00 + -80.364900 43.689467 1719.00 + -80.366100 43.689900 1724.00 + -80.367183 43.689550 1727.00 + -80.367983 43.688800 1724.00 + -80.368633 43.687900 1721.00 + -80.369267 43.686917 1729.00 + -80.369983 43.685883 1734.00 + -80.369617 43.684767 1748.00 + -80.368050 43.684667 1753.00 + -80.367250 43.685667 1754.00 + -80.368033 43.686633 1769.00 + -80.369367 43.686833 1786.00 + -80.369500 43.685817 1794.00 + -80.368050 43.685450 1802.00 + -80.366983 43.686317 1807.00 + -80.367450 43.687450 1826.00 + -80.368683 43.687833 1841.00 + -80.369167 43.686833 1849.00 + -80.368133 43.685917 1865.00 + -80.366500 43.685933 1876.00 + -80.365517 43.686883 1891.00 + -80.366150 43.687817 1907.00 + -80.367383 43.687667 1923.00 + -80.367483 43.686750 1938.00 + -80.366167 43.686217 1939.00 + -80.365267 43.687250 1942.00 + -80.366250 43.688050 1961.00 + -80.367550 43.687867 1976.00 + -80.367517 43.686917 1987.00 + -80.366083 43.686533 1992.00 + -80.364700 43.687183 1998.00 + -80.364267 43.688350 2009.00 + -80.364617 43.689517 2025.00 + -80.365867 43.690117 2039.00 + -80.366983 43.689567 2040.00 + -80.366717 43.688517 2055.00 + -80.365267 43.688317 2071.00 + -80.364017 43.689133 2070.00 + -80.364117 43.690333 2088.00 + -80.364917 43.691217 2090.00 + -80.366333 43.691267 2090.00 + -80.367100 43.690400 2093.00 + -80.367033 43.689267 2105.00 + -80.365683 43.688767 2118.00 + -80.364567 43.689583 2122.00 + -80.365217 43.690467 2133.00 + -80.366500 43.690333 2140.00 + -80.366967 43.689433 2155.00 + -80.366333 43.688550 2159.00 + -80.364783 43.688167 2167.00 + -80.363500 43.688717 2173.00 + -80.363200 43.689833 2160.00 + -80.363667 43.690933 2166.00 + -80.364467 43.691900 2175.00 + -80.365433 43.692750 2176.00 + -80.366800 43.692783 2170.00 + -80.367183 43.691783 2174.00 + -80.366267 43.690900 2186.00 + -80.364750 43.690600 2191.00 + -80.363100 43.690967 2204.00 + -80.361700 43.691650 2215.00 + -80.360750 43.692650 2219.00 + -80.361067 43.693750 2220.00 + -80.362450 43.694067 2217.00 + -80.363417 43.693350 2215.00 + -80.363200 43.692317 2217.00 + -80.361917 43.691600 2227.00 + -80.360317 43.691600 2234.00 + -80.358933 43.692300 2223.00 + -80.358833 43.693467 2230.00 + -80.360000 43.694067 2229.00 + -80.361533 43.694000 2225.00 + -80.362967 43.694000 2230.00 + -80.364383 43.693883 2232.00 + -80.365833 43.693700 2235.00 + -80.367333 43.693500 2247.00 + -80.368850 43.693317 2248.00 + -80.370533 43.693117 2248.00 + -80.372367 43.692817 2248.00 + -80.374183 43.692600 2253.00 + -80.375767 43.692517 2248.00 + -80.377450 43.692317 2229.00 + -80.379383 43.692017 2217.00 + -80.381383 43.691617 2213.00 + -80.383067 43.691167 2222.00 + -80.384517 43.690900 2224.00 + -80.385933 43.690600 2217.00 + -80.387383 43.690300 2211.00 + -80.388767 43.689917 2205.00 + -80.390167 43.689417 2196.00 + -80.391733 43.688967 2189.00 + -80.393350 43.688550 2188.00 + -80.394967 43.688200 2188.00 + -80.396533 43.687967 2185.00 + -80.398150 43.687783 2177.00 + -80.399833 43.687933 2173.00 + -80.401533 43.688150 2162.00 + -80.403333 43.688333 2151.00 + -80.405200 43.688550 2146.00 + -80.407017 43.688750 2144.00 + -80.408817 43.688933 2128.00 + -80.410733 43.689050 2128.00 + -80.412700 43.689217 2113.00 + -80.414783 43.689383 2100.00 + -80.416933 43.689467 2094.00 + -80.419050 43.689550 2085.00 + -80.421250 43.689633 2078.00 + -80.423350 43.689733 2078.00 + -80.425350 43.689800 2074.00 + -80.427233 43.689767 2074.00 + -80.429050 43.689750 2071.00 + -80.430717 43.689817 2072.00 + -80.432267 43.689700 2068.00 + -80.433717 43.689300 2060.00 + -80.435117 43.688617 2059.00 + -80.436383 43.687783 2067.00 + -80.437567 43.686700 2080.00 + -80.437483 43.685500 2099.00 + -80.436067 43.685533 2091.00 + -80.435817 43.686817 2076.00 + -80.436817 43.687933 2096.00 + -80.438267 43.688700 2109.00 + -80.439383 43.688033 2120.00 + -80.438317 43.687400 2122.00 + -80.437967 43.688667 2130.00 + -80.439433 43.689267 2151.00 + -80.440600 43.688600 2154.00 + -80.440100 43.687650 2159.00 + -80.438650 43.687383 2167.00 + -80.437233 43.687717 2188.00 + -80.436233 43.688467 2201.00 + -80.436633 43.689533 2212.00 + -80.437950 43.689933 2220.00 + -80.439050 43.689333 2222.00 + -80.439017 43.688250 2225.00 + -80.438000 43.687433 2237.00 + -80.436633 43.687017 2251.00 + -80.435417 43.687550 2252.00 + -80.435683 43.688650 2257.00 + -80.437017 43.689217 2271.00 + -80.438483 43.689117 2280.00 + -80.439583 43.688383 2283.00 + -80.438783 43.687517 2280.00 + -80.437600 43.688267 2286.00 + -80.437433 43.689500 2293.00 + -80.437600 43.690850 2293.00 + -80.437917 43.692167 2304.00 + -80.438350 43.693350 2312.00 + -80.438733 43.694550 2312.00 + -80.439133 43.695983 2303.00 + -80.439617 43.697583 2285.00 + -80.440233 43.699150 2282.00 + -80.440617 43.700883 2262.00 + -80.440817 43.702817 2240.00 + -80.440933 43.704917 2214.00 + -80.441017 43.707200 2186.00 + -80.441067 43.709483 2184.00 + -80.441067 43.711700 2175.00 + -80.441067 43.713883 2171.00 + -80.441083 43.715967 2173.00 + -80.441100 43.717900 2176.00 + -80.441067 43.719767 2174.00 + -80.441067 43.721600 2164.00 + -80.441033 43.723433 2156.00 + -80.441083 43.725267 2150.00 + -80.441150 43.727050 2152.00 + -80.441150 43.728750 2155.00 + -80.441067 43.730500 2143.00 + -80.441017 43.732283 2128.00 + -80.441083 43.734167 2118.00 + -80.441117 43.736100 2106.00 + -80.441000 43.738000 2096.00 + -80.440817 43.739817 2098.00 + -80.440683 43.741550 2093.00 + -80.440533 43.743333 2085.00 + -80.440433 43.745150 2091.00 + -80.440317 43.746883 2093.00 + -80.440217 43.748583 2089.00 + -80.440150 43.750267 2082.00 + -80.440150 43.752033 2070.00 + -80.440217 43.753917 2061.00 + -80.440117 43.755850 2054.00 + -80.439900 43.757817 2043.00 + -80.439650 43.759833 2029.00 + -80.439483 43.761867 2027.00 + -80.439367 43.763800 2027.00 + -80.439350 43.765900 2019.00 + -80.439267 43.767783 2011.00 + -80.439100 43.769617 2006.00 + -80.438983 43.771417 1993.00 + -80.438883 43.773233 1979.00 + -80.438717 43.775067 1966.00 + -80.438533 43.776933 1955.00 + -80.438350 43.778783 1949.00 + -80.438133 43.780583 1940.00 + -80.437867 43.782433 1926.00 + -80.437667 43.784350 1914.00 + -80.437583 43.786317 1903.00 + -80.437483 43.788283 1902.00 + -80.437350 43.790150 1906.00 + -80.437183 43.791950 1900.00 + -80.437017 43.793750 1893.00 + -80.436817 43.795533 1889.00 + -80.436533 43.797350 1869.00 + -80.435583 43.799100 1863.00 + -80.434467 43.800683 1862.00 + -80.433400 43.802300 1856.00 + -80.432333 43.803950 1849.00 + -80.431200 43.805617 1848.00 + -80.430017 43.807233 1855.00 + -80.428983 43.808717 1865.00 + -80.428033 43.810167 1871.00 + -80.427150 43.811550 1881.00 + -80.426250 43.812900 1889.00 + -80.425233 43.814183 1896.00 + -80.424300 43.815550 1900.00 + -80.423450 43.817000 1897.00 + -80.422700 43.818500 1887.00 + -80.421950 43.820067 1881.00 + -80.421167 43.821667 1879.00 + -80.420417 43.823317 1877.00 + -80.419767 43.825017 1874.00 + -80.418883 43.826717 1866.00 + -80.417900 43.828383 1863.00 + -80.417000 43.830017 1860.00 + -80.416100 43.831617 1852.00 + -80.415233 43.833283 1845.00 + -80.414467 43.835017 1840.00 + -80.414550 43.836550 1870.00 + -80.415967 43.836833 1884.00 + -80.416833 43.836150 1897.00 + -80.416800 43.835167 1899.00 + -80.415950 43.834283 1903.00 + -80.414400 43.833917 1903.00 + -80.412667 43.834267 1902.00 + -80.411367 43.835167 1902.00 + -80.410733 43.836367 1900.00 + -80.410783 43.837583 1902.00 + -80.411483 43.838650 1904.00 + -80.412783 43.839367 1902.00 + -80.414433 43.839783 1898.00 + -80.416150 43.840133 1911.00 + -80.417733 43.840467 1921.00 + -80.419267 43.840283 1936.00 + -80.419700 43.839367 1946.00 + -80.418933 43.838533 1957.00 + -80.417517 43.838117 1967.00 + -80.415950 43.838217 1978.00 + -80.414600 43.838883 1979.00 + -80.414333 43.840017 1983.00 + -80.415367 43.840783 1988.00 + -80.416800 43.840517 1993.00 + -80.417183 43.839533 2008.00 + -80.416300 43.838717 2018.00 + -80.414833 43.838500 2028.00 + -80.413467 43.838967 2031.00 + -80.412833 43.840000 2027.00 + -80.413317 43.841067 2029.00 + -80.414550 43.841783 2037.00 + -80.416017 43.841867 2044.00 + -80.417183 43.841333 2051.00 + -80.417700 43.840383 2059.00 + -80.417550 43.839333 2070.00 + -80.417000 43.838400 2078.00 + -80.415767 43.837800 2078.00 + -80.414150 43.837833 2077.00 + -80.412750 43.838483 2080.00 + -80.412167 43.839567 2083.00 + -80.412483 43.840667 2083.00 + -80.413417 43.841567 2087.00 + -80.414600 43.842400 2087.00 + -80.415950 43.843150 2087.00 + -80.417483 43.844000 2096.00 + -80.418817 43.844833 2112.00 + -80.420317 43.845233 2114.00 + -80.420533 43.844383 2119.00 + -80.419033 43.844117 2124.00 + -80.417350 43.844500 2136.00 + -80.416183 43.845350 2156.00 + -80.416550 43.846433 2165.00 + -80.417950 43.846567 2169.00 + -80.418200 43.845750 2171.00 + -80.416733 43.845333 2184.00 + -80.415317 43.845733 2200.00 + -80.414767 43.846767 2204.00 + -80.415017 43.848000 2206.00 + -80.415400 43.849250 2209.00 + -80.415917 43.850467 2212.00 + -80.416417 43.851667 2212.00 + -80.416967 43.852933 2199.00 + -80.417667 43.854317 2192.00 + -80.418367 43.855717 2196.00 + -80.419183 43.857000 2198.00 + -80.419883 43.858267 2193.00 + -80.420600 43.859600 2188.00 + -80.421333 43.860967 2181.00 + -80.421983 43.862367 2175.00 + -80.422467 43.863733 2177.00 + -80.422983 43.865000 2170.00 + -80.423650 43.866317 2155.00 + -80.424283 43.867767 2140.00 + -80.424950 43.869250 2135.00 + -80.425617 43.870733 2130.00 + -80.426183 43.872350 2123.00 + -80.426633 43.873817 2123.00 + -80.427167 43.875233 2119.00 + -80.427683 43.876683 2116.00 + -80.428050 43.878067 2117.00 + -80.428467 43.879417 2110.00 + -80.428933 43.880800 2102.00 + -80.429400 43.882233 2097.00 + -80.429883 43.883633 2095.00 + -80.430400 43.885017 2090.00 + -80.430900 43.886417 2087.00 + -80.431433 43.887800 2081.00 + -80.432117 43.889183 2071.00 + -80.432817 43.890633 2067.00 + -80.433500 43.892083 2065.00 + -80.434017 43.893567 2069.00 + -80.434433 43.895050 2064.00 + -80.434867 43.896517 2060.00 + -80.435383 43.897967 2050.00 + -80.435917 43.899450 2039.00 + -80.436367 43.900967 2033.00 + -80.436633 43.902383 2057.00 + -80.436700 43.903517 2075.00 + -80.436883 43.904767 2074.00 + -80.437083 43.906000 2081.00 + -80.437267 43.907083 2081.00 + -80.437550 43.908483 2081.00 + -80.437767 43.909767 2078.00 + -80.438000 43.911100 2061.00 + -80.438300 43.912567 2047.00 + -80.438567 43.914083 2039.00 + -80.438867 43.915617 2029.00 + -80.439233 43.917167 2021.00 + -80.439500 43.918733 2009.00 + -80.439800 43.920300 2006.00 + -80.440050 43.921750 2008.00 + -80.440233 43.923150 2004.00 + -80.440367 43.924550 1993.00 + -80.440500 43.926033 1982.00 + -80.440733 43.927533 1972.00 + -80.441083 43.929067 1960.00 + -80.441250 43.930633 1957.00 + -80.440950 43.932067 1968.00 + -80.440467 43.933383 1978.00 + -80.439800 43.934633 1981.00 + -80.439833 43.935900 1996.00 + -80.440867 43.936750 2008.00 + -80.441933 43.936400 2017.00 + -80.441417 43.935550 2021.00 + -80.439950 43.935333 2035.00 + -80.438650 43.935967 2045.00 + -80.438267 43.937133 2049.00 + -80.439083 43.938083 2052.00 + -80.440433 43.938050 2060.00 + -80.441050 43.937250 2066.00 + -80.440567 43.936333 2075.00 + -80.439300 43.935817 2085.00 + -80.437800 43.935650 2092.00 + -80.436283 43.936100 2090.00 + -80.435650 43.937250 2097.00 + -80.435917 43.938383 2101.00 + -80.437033 43.939000 2106.00 + -80.438350 43.939050 2111.00 + -80.439300 43.938517 2120.00 + -80.439433 43.937667 2122.00 + -80.438433 43.936900 2124.00 + -80.436917 43.936967 2137.00 + -80.435867 43.937783 2136.00 + -80.435567 43.939033 2129.00 + -80.435600 43.940333 2131.00 + -80.435900 43.941600 2131.00 + -80.436367 43.942883 2129.00 + -80.436917 43.944183 2128.00 + -80.437550 43.945450 2128.00 + -80.438183 43.946750 2124.00 + -80.438850 43.948033 2122.00 + -80.439650 43.949283 2125.00 + -80.440567 43.950633 2129.00 + -80.441450 43.951867 2132.00 + -80.442367 43.953133 2129.00 + -80.443217 43.954417 2125.00 + -80.443933 43.955667 2120.00 + -80.444650 43.956933 2108.00 + -80.445417 43.958217 2106.00 + -80.446150 43.959533 2096.00 + -80.446917 43.960833 2095.00 + -80.447400 43.962133 2095.00 + -80.447767 43.963417 2083.00 + -80.448250 43.964783 2070.00 + -80.448750 43.966200 2066.00 + -80.449233 43.967533 2069.00 + -80.449750 43.968817 2067.00 + -80.450267 43.970033 2061.00 + -80.450833 43.971333 2044.00 + -80.451617 43.972683 2034.00 + -80.452317 43.974100 2029.00 + -80.453133 43.975500 2022.00 + -80.453967 43.976867 2022.00 + -80.454783 43.978217 2022.00 + -80.455600 43.979500 2022.00 + -80.456467 43.980683 2021.00 + -80.457317 43.981900 2009.00 + -80.458150 43.983133 2005.00 + -80.458950 43.984350 2000.00 + -80.459767 43.985583 1989.00 + -80.460617 43.986867 1977.00 + -80.461417 43.988150 1970.00 + -80.462217 43.989317 1969.00 + -80.463150 43.990433 1956.00 + -80.464183 43.991567 1952.00 + -80.465217 43.992717 1948.00 + -80.466183 43.993883 1943.00 + -80.467200 43.995050 1928.00 + -80.468267 43.996267 1910.00 + -80.469367 43.997617 1895.00 + -80.470500 43.999000 1880.00 + -80.471600 44.000433 1869.00 + -80.472633 44.001883 1858.00 + -80.473717 44.003317 1850.00 + -80.474700 44.004767 1843.00 + -80.475683 44.006233 1834.00 + -80.476600 44.007700 1826.00 + -80.477517 44.009133 1817.00 + -80.478483 44.010517 1820.00 + -80.479333 44.011733 1831.00 + -80.480283 44.012867 1831.00 + -80.481350 44.014033 1834.00 + -80.482483 44.015183 1843.00 + -80.483600 44.016367 1855.00 + -80.483317 44.017867 1868.00 + -80.481683 44.018667 1877.00 + -80.480350 44.018050 1886.00 + -80.481067 44.017133 1892.00 + -80.482917 44.017283 1907.00 + -80.484033 44.018467 1929.00 + -80.483567 44.019867 1942.00 + -80.482067 44.020433 1952.00 + -80.481000 44.019783 1961.00 + -80.481600 44.018800 1967.00 + -80.483317 44.018867 1982.00 + -80.483833 44.020167 2004.00 + -80.482533 44.021067 2009.00 + -80.481183 44.020733 2015.00 + -80.481417 44.019850 2027.00 + -80.482783 44.019450 2034.00 + -80.484267 44.020300 2038.00 + -80.484067 44.021917 2036.00 + -80.482267 44.022700 2043.00 + -80.480933 44.022317 2068.00 + -80.480133 44.021600 2075.00 + -80.479417 44.020783 2087.00 + -80.479017 44.019917 2091.00 + -80.479917 44.019183 2087.00 + -80.481550 44.019483 2094.00 + -80.482700 44.020600 2103.00 + -80.483233 44.021967 2111.00 + -80.482517 44.023283 2117.00 + -80.480950 44.023783 2120.00 + -80.480100 44.023200 2134.00 + -80.481017 44.022600 2131.00 + -80.482667 44.022750 2136.00 + -80.484150 44.023533 2146.00 + -80.485333 44.024600 2148.00 + -80.486433 44.025783 2145.00 + -80.487517 44.026917 2138.00 + -80.488650 44.027950 2136.00 + -80.489733 44.029000 2129.00 + -80.490867 44.030117 2116.00 + -80.490700 44.031483 2108.00 + -80.489133 44.031717 2099.00 + -80.488350 44.030783 2088.00 + -80.487733 44.029650 2071.00 + -80.487133 44.028383 2062.00 + -80.486533 44.026967 2040.00 + -80.485917 44.025367 2022.00 + -80.485350 44.023717 2027.00 + -80.484900 44.022083 2028.00 + -80.484417 44.020517 2030.00 + -80.483933 44.018950 2029.00 + -80.483433 44.017433 2035.00 + -80.482917 44.015867 2037.00 + -80.482483 44.014250 2031.00 + -80.482000 44.012600 2019.00 + -80.481433 44.010950 2009.00 + -80.480783 44.009300 2001.00 + -80.480117 44.007650 1991.00 + -80.479450 44.005950 1977.00 + -80.478833 44.004217 1967.00 + -80.478217 44.002467 1956.00 + -80.477567 44.000683 1948.00 + -80.476900 43.998933 1946.00 + -80.476217 43.997183 1935.00 + -80.475617 43.995433 1929.00 + -80.475100 43.993717 1922.00 + -80.474567 43.992017 1911.00 + -80.473983 43.990317 1900.00 + -80.473483 43.988600 1892.00 + -80.473067 43.986883 1880.00 + -80.472633 43.985133 1866.00 + -80.472217 43.983417 1857.00 + -80.471883 43.981717 1845.00 + -80.471550 43.980033 1827.00 + -80.471183 43.978350 1813.00 + -80.470867 43.976633 1793.00 + -80.470417 43.974950 1786.00 + -80.469833 43.973117 1779.00 + -80.469183 43.971483 1775.00 + -80.468600 43.969833 1774.00 + -80.468067 43.968183 1771.00 + -80.467483 43.966483 1758.00 + -80.466867 43.964767 1749.00 + -80.466267 43.963100 1736.00 + -80.465717 43.961433 1722.00 + -80.465183 43.959783 1703.00 + -80.464617 43.958100 1685.00 + -80.464133 43.956400 1674.00 + -80.463783 43.954700 1664.00 + -80.463417 43.952983 1650.00 + -80.463033 43.951233 1642.00 + -80.462667 43.949483 1639.00 + -80.462250 43.947767 1634.00 + -80.461850 43.945983 1632.00 + -80.461467 43.944217 1639.00 + -80.461133 43.942483 1644.00 + -80.460783 43.940750 1642.00 + -80.460483 43.939017 1633.00 + -80.460200 43.937283 1628.00 + -80.459933 43.935550 1620.00 + -80.459633 43.933767 1606.00 + -80.459317 43.931950 1598.00 + -80.458950 43.930117 1590.00 + -80.458567 43.928283 1583.00 + -80.458133 43.926467 1587.00 + -80.457683 43.924733 1581.00 + -80.457267 43.923017 1575.00 + -80.456917 43.921317 1565.00 + -80.456533 43.919633 1551.00 + -80.456183 43.917933 1538.00 + -80.455817 43.916267 1520.00 + -80.455400 43.914567 1509.00 + -80.455067 43.912900 1497.00 + -80.454900 43.911283 1486.00 + -80.454733 43.909650 1464.00 + -80.454517 43.908017 1453.00 + -80.454383 43.906383 1447.00 + -80.454233 43.904767 1430.00 + -80.454033 43.902933 1408.00 + -80.453783 43.900950 1383.00 + -80.453517 43.898933 1370.00 + -80.453217 43.896983 1357.00 + -80.452867 43.895083 1349.00 + -80.452533 43.893200 1332.00 + -80.452217 43.891300 1319.00 + -80.451983 43.889383 1310.00 + -80.451767 43.887483 1300.00 + -80.451567 43.885533 1300.00 + -80.451367 43.883650 1303.00 + -80.451150 43.881833 1303.00 + -80.450833 43.880033 1295.00 + -80.450400 43.878250 1282.00 + -80.449850 43.876450 1271.00 + -80.449300 43.874617 1254.00 + -80.448950 43.872667 1241.00 + -80.448750 43.870633 1235.00 + -80.448717 43.868600 1232.00 + -80.448750 43.866567 1230.00 + -80.448800 43.864583 1226.00 + -80.448883 43.862600 1217.00 + -80.449067 43.860683 1213.00 + -80.449450 43.858883 1210.00 + -80.450083 43.857167 1202.00 + -80.450900 43.855517 1197.00 + -80.451850 43.853967 1191.00 + -80.452817 43.852467 1184.00 + -80.453533 43.850983 1180.00 + -80.454167 43.849367 1177.00 + -80.454617 43.847900 1167.00 + -80.455050 43.846350 1156.00 + -80.455317 43.844733 1145.00 + -80.455333 43.843067 1138.00 + -80.455217 43.841450 1142.00 + -80.455067 43.839950 1145.00 + -80.454850 43.838517 1149.00 + -80.454583 43.837267 1153.00 + -80.454167 43.836083 1138.00 + -80.453483 43.834967 1132.00 + -80.452700 43.833900 1119.00 + -80.451717 43.832800 1107.00 + -80.450633 43.831667 1099.00 + -80.449400 43.830550 1081.00 + -80.448217 43.829417 1065.00 + -80.447017 43.828350 1049.00 + -80.445867 43.827350 1043.00 + -80.444683 43.826433 1021.00 + -80.443350 43.825600 997.00 + -80.441833 43.824883 972.00 + -80.440083 43.824383 952.00 + -80.438200 43.824050 933.00 + -80.436283 43.823900 915.00 + -80.434350 43.824083 900.00 + -80.432483 43.824517 885.00 + -80.430700 43.825133 867.00 + -80.428983 43.825817 846.00 + -80.427300 43.826550 830.00 + -80.425733 43.827333 814.00 + -80.424217 43.828167 799.00 + -80.422750 43.829083 783.00 + -80.421333 43.830050 762.00 + -80.420200 43.831217 746.00 + -80.419800 43.832567 736.00 + -80.420200 43.833850 723.00 + -80.421250 43.834967 711.00 + -80.422550 43.835967 699.00 + -80.423917 43.836917 691.00 + -80.425367 43.837883 680.00 + -80.426800 43.838917 662.00 + -80.428100 43.840067 648.00 + -80.429167 43.841300 636.00 + -80.430033 43.842617 629.00 + -80.430733 43.844033 623.00 + -80.431250 43.845567 622.00 + -80.431583 43.847067 618.00 + -80.431950 43.848550 609.00 + -80.432533 43.849917 603.00 + -80.433750 43.850917 596.00 + -80.435317 43.851267 586.00 + -80.436950 43.851283 574.00 + -80.438617 43.851017 558.00 + -80.440267 43.850617 543.00 + -80.441800 43.850050 529.00 + -80.443267 43.849383 511.00 + -80.444617 43.848583 496.00 + -80.445483 43.847517 484.00 + -80.445250 43.846283 472.00 + -80.444717 43.845050 459.00 + -80.444150 43.843833 451.00 + -80.443633 43.842650 444.00 + -80.443167 43.841567 443.00 + -80.442850 43.840800 443.00 + -80.442750 43.840550 443.00 + -80.442750 43.840550 443.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840567 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442750 43.840550 444.00 + -80.442733 43.840533 444.00 + -80.442700 43.840483 444.00 + -80.442650 43.840433 445.00 + -80.442583 43.840383 444.00 + -80.442517 43.840317 444.00 + -80.442450 43.840267 444.00 + -80.442383 43.840200 444.00 + -80.442300 43.840150 444.00 + -80.442233 43.840117 444.00 + -80.442200 43.840067 444.00 + -80.442167 43.840017 444.00 + -80.442117 43.839983 444.00 + -80.442067 43.839933 444.00 + -80.442033 43.839900 444.00 + -80.441983 43.839850 444.00 + -80.441933 43.839817 444.00 + -80.441883 43.839767 444.00 + -80.441833 43.839733 444.00 + -80.441767 43.839683 444.00 + -80.441717 43.839650 444.00 + -80.441650 43.839617 444.00 + -80.441600 43.839567 444.00 + -80.441533 43.839533 444.00 + -80.441500 43.839483 444.00 + -80.441433 43.839450 444.00 + -80.441350 43.839400 444.00 + -80.441317 43.839367 444.00 + -80.441250 43.839317 444.00 + -80.441200 43.839283 444.00 + -80.441150 43.839250 444.00 + -80.441100 43.839200 444.00 + -80.441067 43.839167 443.00 + -80.441017 43.839133 443.00 + -80.440967 43.839083 444.00 + -80.440933 43.839050 443.00 + -80.440883 43.839017 443.00 + -80.440817 43.838983 443.00 + -80.440767 43.838933 443.00 + -80.440700 43.838900 443.00 + -80.440667 43.838867 443.00 + -80.440617 43.838817 444.00 + -80.440533 43.838767 444.00 + -80.440483 43.838733 444.00 + -80.440433 43.838700 443.00 + -80.440383 43.838650 444.00 + -80.440333 43.838600 444.00 + -80.440267 43.838567 443.00 + -80.440233 43.838533 443.00 + -80.440183 43.838483 444.00 + -80.440117 43.838450 444.00 + -80.440083 43.838417 443.00 + -80.440033 43.838383 443.00 + -80.439983 43.838350 444.00 + -80.439950 43.838300 443.00 + -80.439883 43.838267 444.00 + -80.439850 43.838233 444.00 + -80.439800 43.838183 444.00 + -80.439750 43.838150 444.00 + -80.439717 43.838117 444.00 + -80.439683 43.838083 444.00 + -80.439617 43.838050 443.00 + -80.439567 43.838000 443.00 + -80.439517 43.837967 444.00 + -80.439483 43.837933 443.00 + -80.439433 43.837900 443.00 + -80.439367 43.837867 444.00 + -80.439317 43.837817 444.00 + -80.439250 43.837783 443.00 + -80.439200 43.837733 443.00 + -80.439150 43.837700 443.00 + -80.439100 43.837667 443.00 + -80.439050 43.837633 443.00 + -80.439000 43.837600 443.00 + -80.438950 43.837550 443.00 + -80.438900 43.837517 443.00 + -80.438833 43.837483 443.00 + -80.438783 43.837450 443.00 + + + + 0 + 0 + 0 + 0.46 + 0.76 + 0.96 + 1.12 + 1.11 + 1.08 + 1.01 + 1.03 + 1.01 + 0.97 + 1 + 0.97 + 0.95 + 0.99 + 1.03 + 1.02 + 1.03 + 1.03 + 1.01 + 1.07 + 1.12 + 1.22 + 1.31 + 1.26 + 1.28 + 1.22 + 1.19 + 1.21 + 1.15 + 1.12 + 1.08 + 1.03 + 1.03 + 1.04 + 0.98 + 0.97 + 0.95 + 0.97 + 1.02 + 0.99 + 1 + 1 + 1.02 + 1.12 + 1.17 + 1.27 + 1.29 + 1.36 + 1.4 + 1.38 + 1.36 + 1.33 + 1.28 + 1.21 + 1.17 + 1.18 + 1.15 + 1.1 + 1.09 + 1.14 + 1.19 + 1.18 + 1.19 + 1.16 + 1.13 + 1.15 + 1.1 + 1.09 + 1.14 + 1.21 + 1.31 + 1.26 + 1.08 + 0.97 + 0.95 + 0.93 + 0.88 + 0.82 + 0.83 + 0.87 + 0.88 + 0.9 + 0.88 + 0.89 + 0.91 + 0.79 + 0.82 + 0.88 + 0.87 + 0.85 + 0.81 + 0.82 + 0.77 + 0.81 + 0.84 + 0.87 + 0.85 + 0.74 + 0.79 + 0.81 + 0.83 + 0.88 + 0.89 + 0.83 + 0.86 + 0.78 + 0.79 + 0.88 + 0.91 + 0.91 + 0.9 + 0.84 + 0.8 + 0.97 + 0.98 + 0.97 + 0.92 + 0.85 + 0.87 + 0.94 + 0.97 + 0.93 + 0.87 + 0.85 + 0.8 + 0.92 + 0.9 + 0.86 + 0.84 + 0.81 + 0.76 + 0.88 + 0.91 + 0.89 + 0.85 + 0.9 + 0.89 + 0.89 + 0.95 + 0.93 + 0.91 + 0.85 + 0.83 + 0.83 + 0.77 + 0.83 + 0.88 + 0.93 + 0.9 + 0.89 + 0.79 + 0.75 + 0.75 + 0.93 + 0.83 + 0.96 + 0.89 + 0.79 + 0.81 + 0.87 + 0.95 + 0.96 + 0.88 + 0.77 + 0.84 + 0.86 + 0.96 + 0.94 + 0.85 + 0.78 + 0.87 + 0.85 + 0.93 + 0.9 + 0.88 + 0.85 + 0.84 + 0.86 + 0.85 + 0.93 + 1 + 0.94 + 0.9 + 0.87 + 0.85 + 0.86 + 0.99 + 1.03 + 1.11 + 1.2 + 1.26 + 1.2 + 0.82 + 0.8 + 1.04 + 1.17 + 1.2 + 1.24 + 1.26 + 1.28 + 1.3 + 1.3 + 0.87 + 0.97 + 0.99 + 1.13 + 1.23 + 1.27 + 1.3 + 1.35 + 1.39 + 1.38 + 1.35 + 1.14 + 1.15 + 1.34 + 1.36 + 1.29 + 1.22 + 1.17 + 1.16 + 1.14 + 1.16 + 1.15 + 1.17 + 1.07 + 0.9 + 0.86 + 0.99 + 1.1 + 1.15 + 1.19 + 1.24 + 1.24 + 1.17 + 1.16 + 1.19 + 1.24 + 1.29 + 1.32 + 1.32 + 1.24 + 1.22 + 1.19 + 1.19 + 1.24 + 1.29 + 1.35 + 1.39 + 1.39 + 1.36 + 1.34 + 1.32 + 1.31 + 1.37 + 1.39 + 1.41 + 1.38 + 1.38 + 1.36 + 1.38 + 1.41 + 1.41 + 1.43 + 1.48 + 1.48 + 1.4 + 1.33 + 1.34 + 1.39 + 1.42 + 1.4 + 1.32 + 1.27 + 1.28 + 1.34 + 1.41 + 1.41 + 1.38 + 1.3 + 1.12 + 1 + 0.96 + 0.92 + 0.96 + 0.95 + 0.97 + 0.95 + 0.96 + 1.01 + 1.07 + 1.08 + 1.03 + 1 + 0.98 + 1.01 + 1.05 + 1.04 + 1.02 + 0.98 + 0.99 + 0.97 + 0.99 + 1.05 + 0.94 + 0.83 + 0.75 + 0.7 + 0.78 + 0.84 + 0.86 + 0.96 + 0.94 + 0.99 + 0.94 + 0.91 + 0.84 + 0.93 + 0.95 + 1.01 + 0.9 + 0.85 + 0.98 + 0.96 + 0.99 + 0.95 + 0.81 + 0.77 + 0.81 + 1.06 + 1 + 0.82 + 0.79 + 0.88 + 0.96 + 0.97 + 0.98 + 0.91 + 0.77 + 0.87 + 0.89 + 0.92 + 1.04 + 0.9 + 0.88 + 0.83 + 0.88 + 0.93 + 0.98 + 0.94 + 0.78 + 0.79 + 0.79 + 0.88 + 0.95 + 0.87 + 0.96 + 0.89 + 0.89 + 0.87 + 0.83 + 0.9 + 0.9 + 0.96 + 0.99 + 0.96 + 0.97 + 0.89 + 0.84 + 0.84 + 0.89 + 0.95 + 0.95 + 1.04 + 0.88 + 0.86 + 0.88 + 0.81 + 0.82 + 0.88 + 0.86 + 0.93 + 1.04 + 1.11 + 0.99 + 0.91 + 1.07 + 1.19 + 1.16 + 0.94 + 0.84 + 0.86 + 0.86 + 0.86 + 0.94 + 1 + 0.98 + 0.95 + 0.92 + 0.96 + 0.98 + 1.01 + 1.08 + 1.08 + 1.05 + 1.08 + 1.12 + 1.18 + 1.25 + 1.22 + 1.25 + 1.25 + 1.18 + 1.12 + 1.06 + 1.03 + 0.92 + 0.89 + 0.93 + 0.98 + 1.03 + 1.14 + 0.93 + 0.91 + 1.08 + 1.07 + 1.04 + 0.92 + 1.01 + 1.11 + 0.95 + 0.89 + 0.85 + 0.87 + 0.86 + 0.9 + 0.9 + 0.83 + 0.86 + 0.9 + 0.88 + 0.86 + 0.91 + 0.95 + 0.88 + 0.88 + 0.92 + 0.99 + 0.97 + 1.02 + 1.1 + 1.02 + 0.95 + 1.07 + 1.24 + 1.29 + 1.34 + 1.47 + 1.61 + 1.74 + 1.86 + 1.79 + 1.76 + 1.71 + 1.61 + 1.51 + 1.46 + 1.47 + 1.46 + 1.45 + 1.4 + 1.36 + 1.4 + 1.46 + 1.52 + 1.54 + 1.49 + 1.39 + 1.42 + 1.44 + 1.42 + 1.37 + 1.34 + 1.37 + 1.46 + 1.53 + 1.56 + 1.59 + 1.64 + 1.58 + 1.52 + 1.51 + 1.5 + 1.44 + 1.43 + 1.46 + 1.49 + 1.48 + 1.47 + 1.45 + 1.5 + 1.56 + 1.58 + 1.54 + 1.44 + 1.44 + 1.44 + 1.42 + 1.51 + 1.44 + 1.41 + 1.43 + 1.48 + 1.48 + 1.4 + 1.3 + 1.25 + 1.2 + 1.18 + 1.19 + 1.23 + 1.27 + 1.29 + 1.34 + 1.38 + 1.39 + 1.41 + 1.47 + 1.43 + 1.38 + 1.39 + 1.43 + 1.45 + 1.06 + 0.82 + 0.74 + 0.84 + 0.89 + 1.01 + 1.06 + 1.04 + 1.02 + 0.95 + 0.94 + 0.94 + 1.05 + 0.99 + 0.94 + 0.87 + 0.79 + 0.84 + 0.9 + 0.93 + 0.97 + 0.9 + 0.89 + 0.87 + 0.83 + 0.86 + 0.88 + 0.9 + 0.9 + 0.93 + 0.9 + 0.82 + 0.79 + 0.84 + 0.83 + 0.82 + 0.92 + 0.96 + 0.95 + 0.91 + 0.89 + 0.93 + 0.97 + 0.98 + 1.02 + 1.01 + 0.89 + 0.79 + 1.01 + 1.01 + 0.95 + 0.94 + 0.75 + 0.85 + 0.93 + 0.89 + 0.94 + 1.02 + 1.02 + 0.99 + 1 + 1.13 + 1.21 + 1.16 + 1.09 + 1.12 + 1.15 + 1.18 + 1.17 + 1.06 + 1.08 + 1.16 + 1.24 + 1.24 + 1.23 + 1.23 + 1.16 + 1.19 + 1.17 + 1.09 + 1.12 + 1.16 + 1.16 + 1.15 + 1.16 + 1.15 + 1.14 + 1.2 + 1.23 + 1.23 + 1.21 + 1.22 + 1.18 + 1.21 + 1.23 + 1.22 + 1.05 + 0.9 + 1.03 + 0.96 + 1.01 + 1.04 + 1.01 + 1.13 + 1.21 + 1.23 + 1.25 + 1.26 + 1.26 + 1.24 + 1.12 + 1.11 + 1.14 + 1.2 + 1.22 + 1.25 + 1.23 + 1.11 + 1.07 + 1.05 + 0.99 + 0.86 + 0.71 + 0.86 + 0.91 + 0.94 + 0.97 + 0.88 + 0.78 + 0.77 + 0.82 + 0.86 + 0.89 + 1.02 + 0.98 + 0.88 + 0.8 + 0.75 + 0.66 + 0.76 + 0.92 + 0.88 + 0.96 + 1.05 + 1.02 + 1.03 + 1.08 + 1.06 + 1.1 + 1.09 + 1.1 + 1.09 + 1.09 + 1.12 + 1.14 + 1.12 + 1.08 + 1.1 + 1.11 + 1.14 + 1.12 + 1.01 + 1.08 + 1.16 + 1.16 + 1.08 + 1.02 + 1.03 + 1.13 + 1.19 + 1.2 + 1.21 + 1.19 + 1.15 + 1.09 + 1.06 + 1.09 + 1.09 + 1.08 + 1.11 + 1.13 + 1.1 + 1 + 1.07 + 1.09 + 1.08 + 1.08 + 1.11 + 1.2 + 1.27 + 1.3 + 1.31 + 1.3 + 1.29 + 1.3 + 1.3 + 1.27 + 1.26 + 1.16 + 1.05 + 1.08 + 1.12 + 1.12 + 1.21 + 1.24 + 1.11 + 0.89 + 1 + 1.13 + 1.19 + 1.11 + 0.9 + 0.79 + 0.95 + 1.11 + 1.15 + 0.98 + 0.78 + 0.78 + 0.97 + 1.27 + 1.36 + 1.06 + 0.73 + 0.76 + 0.74 + 0.77 + 0.91 + 1.06 + 1.12 + 1.14 + 1.13 + 0.91 + 0.65 + 0.89 + 1.04 + 1.07 + 1.12 + 1.11 + 1.08 + 1.03 + 1.05 + 1.16 + 1.13 + 0.9 + 0.9 + 1.01 + 1.11 + 1.24 + 1.36 + 1.34 + 1.31 + 1.28 + 1.26 + 1.25 + 1.3 + 1.32 + 1.35 + 1.36 + 1.37 + 1.37 + 1.42 + 1.44 + 1.45 + 1.47 + 1.44 + 1.45 + 1.42 + 1.39 + 1.39 + 1.4 + 1.39 + 1.4 + 1.42 + 1.38 + 1.36 + 1.36 + 1.37 + 1.38 + 1.36 + 1.36 + 1.36 + 1.35 + 1.36 + 1.42 + 1.39 + 1.36 + 1.36 + 1.37 + 1.38 + 1.38 + 1.37 + 1.4 + 1.41 + 1.4 + 1.41 + 1.43 + 1.41 + 1.39 + 1.4 + 1.4 + 1.39 + 1.4 + 1.45 + 1.47 + 1.48 + 1.49 + 1.44 + 1.41 + 1.37 + 1.36 + 1.37 + 1.35 + 1.37 + 1.37 + 1.32 + 1.29 + 1.31 + 1.31 + 1.29 + 1.35 + 1.53 + 1.63 + 1.59 + 1.55 + 1.51 + 1.51 + 1.54 + 1.52 + 1.54 + 1.53 + 1.49 + 1.45 + 1.44 + 1.46 + 1.47 + 1.54 + 1.6 + 1.63 + 1.63 + 1.6 + 1.58 + 1.57 + 1.48 + 1.44 + 1.41 + 1.37 + 1.34 + 1.28 + 1.23 + 1.2 + 1.22 + 1.27 + 1.32 + 1.33 + 1.24 + 1.18 + 1.1 + 0.97 + 0.98 + 0.93 + 1.01 + 1.07 + 1.1 + 1.18 + 1.11 + 1.09 + 1 + 1.01 + 1.03 + 1.07 + 1.09 + 1.11 + 1.12 + 1.12 + 1.13 + 1.15 + 1.14 + 1.1 + 1.1 + 1.11 + 1.11 + 1.13 + 1.15 + 1.08 + 1.07 + 1.07 + 1.09 + 1.11 + 1.15 + 1.18 + 1.17 + 1.16 + 1.16 + 1.23 + 1.25 + 1.2 + 1.18 + 1.12 + 1.02 + 0.94 + 0.95 + 1 + 1 + 0.99 + 0.99 + 1.01 + 0.98 + 1.01 + 1.03 + 1.01 + 0.95 + 0.85 + 0.38 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0.01 + 0.06 + 0.06 + 0.05 + 0.06 + 0.05 + 0.07 + 0.06 + 0.02 + 0.04 + 0.04 + 0.03 + 0.04 + 0.04 + 0.04 + 0.04 + 0.04 + 0.04 + 0.05 + 0.05 + 0.04 + 0.05 + 0.02 + 0.02 + 0.03 + 0.05 + 0.05 + 0.04 + 0.02 + 0.04 + 0.03 + 0.04 + 0.04 + 0.03 + 0.04 + 0.04 + 0.04 + 0.04 + 0.04 + 0.05 + 0.05 + 0.04 + 0.03 + 0.03 + 0.05 + 0.05 + 0.04 + 0.04 + 0.04 + 0.04 + 0.02 + 0.02 + 0.04 + 0.02 + 0.03 + 0.03 + 0.04 + 0.04 + 0.03 + 0.03 + 0.05 + 0.04 + 0.04 + 0.04 + 0.03 + 0.03 + 0.04 + 0.05 + 0.05 + 0.04 + 0.04 + 0.04 + 0.04 + 0.03 + 0.03 + 0.04 + 0.04 + + + 9 + 9 + 9 + 9 + 8 + 9 + 13 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 8 + 9 + 9 + 11 + 10 + 11 + 9 + 10 + 10 + 9 + 9 + 8 + 10 + 10 + 9 + 10 + 11 + 8 + 9 + 8 + 10 + 10 + 9 + 8 + 10 + 9 + 9 + 9 + 10 + 9 + 10 + 10 + 8 + 10 + 10 + 10 + 10 + 9 + 10 + 8 + 7 + 11 + 10 + 11 + 9 + 8 + 8 + 10 + 10 + 10 + 7 + 10 + 8 + 11 + 15 + 9 + 8 + 9 + 10 + 11 + 10 + 9 + 9 + 9 + 10 + 9 + 8 + 10 + 11 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 11 + 10 + 11 + 10 + 9 + 10 + 11 + 10 + 9 + 11 + 10 + 10 + 10 + 10 + 11 + 9 + 10 + 10 + 10 + 10 + 12 + 9 + 10 + 10 + 10 + 10 + 11 + 10 + 12 + 11 + 10 + 10 + 11 + 10 + 10 + 11 + 11 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 10 + 11 + 9 + 9 + 10 + 10 + 9 + 10 + 11 + 10 + 10 + 10 + 11 + 10 + 10 + 9 + 12 + 9 + 11 + 10 + 10 + 11 + 11 + 10 + 11 + 11 + 9 + 13 + 10 + 10 + 10 + 11 + 9 + 13 + 9 + 11 + 10 + 9 + 8 + 11 + 11 + 8 + 10 + 10 + 10 + 11 + 12 + 11 + 10 + 12 + 8 + 9 + 9 + 10 + 15 + 10 + 8 + 10 + 9 + 9 + 9 + 9 + 10 + 8 + 12 + 5 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 11 + 8 + 8 + 9 + 10 + 10 + 10 + 9 + 9 + 9 + 11 + 9 + 10 + 7 + 9 + 8 + 9 + 10 + 9 + 10 + 11 + 10 + 8 + 9 + 9 + 9 + 9 + 8 + 10 + 7 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 8 + 8 + 8 + 8 + 11 + 8 + 10 + 10 + 8 + 9 + 8 + 7 + 8 + 12 + 10 + 9 + 9 + 8 + 9 + 10 + 9 + 8 + 8 + 8 + 9 + 9 + 11 + 9 + 8 + 9 + 9 + 10 + 11 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 11 + 13 + 10 + 11 + 11 + 10 + 10 + 9 + 9 + 9 + 9 + 12 + 10 + 11 + 11 + 8 + 11 + 11 + 11 + 13 + 9 + 12 + 13 + 10 + 10 + 11 + 11 + 11 + 9 + 14 + 11 + 10 + 12 + 11 + 10 + 10 + 9 + 10 + 9 + 12 + 10 + 9 + 13 + 8 + 11 + 10 + 10 + 10 + 11 + 12 + 10 + 11 + 9 + 10 + 10 + 8 + 12 + 8 + 9 + 10 + 12 + 11 + 9 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 9 + 9 + 12 + 10 + 10 + 10 + 9 + 9 + 10 + 8 + 10 + 9 + 10 + 8 + 9 + 10 + 9 + 11 + 9 + 9 + 9 + 9 + 8 + 10 + 10 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 11 + 10 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 8 + 11 + 11 + 11 + 9 + 13 + 13 + 16 + 11 + 10 + 12 + 11 + 11 + 8 + 12 + 10 + 9 + 10 + 10 + 10 + 10 + 11 + 9 + 9 + 9 + 12 + 15 + 10 + 10 + 9 + 8 + 9 + 10 + 8 + 7 + 10 + 10 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 7 + 9 + 9 + 9 + 8 + 9 + 9 + 10 + 10 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 10 + 8 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 8 + 9 + 9 + 8 + 11 + 7 + 8 + 9 + 10 + 9 + 10 + 9 + 9 + 9 + 10 + 10 + 9 + 9 + 11 + 9 + 8 + 9 + 8 + 9 + 8 + 10 + 9 + 9 + 9 + 11 + 12 + 9 + 9 + 10 + 10 + 10 + 9 + 10 + 9 + 10 + 8 + 10 + 9 + 11 + 9 + 10 + 9 + 9 + 9 + 10 + 10 + 10 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 10 + 9 + 9 + 10 + 9 + 10 + 9 + 9 + 9 + 14 + 11 + 9 + 9 + 10 + 12 + 11 + 13 + 10 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 10 + 10 + 8 + 10 + 8 + 9 + 10 + 8 + 9 + 10 + 9 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 8 + 10 + 10 + 11 + 11 + 9 + 10 + 8 + 10 + 9 + 8 + 9 + 9 + 10 + 9 + 9 + 10 + 10 + 8 + 9 + 9 + 9 + 9 + 9 + 10 + 8 + 9 + 12 + 10 + 11 + 11 + 11 + 11 + 9 + 10 + 10 + 9 + 10 + 10 + 9 + 9 + 11 + 9 + 10 + 8 + 10 + 9 + 10 + 11 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 8 + 9 + 8 + 9 + 10 + 11 + 9 + 9 + 10 + 8 + 9 + 10 + 10 + 9 + 8 + 9 + 10 + 10 + 9 + 10 + 9 + 9 + 10 + 8 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 8 + 10 + 10 + 10 + 13 + 11 + 11 + 12 + 11 + 9 + 8 + 10 + 11 + 9 + 10 + 13 + 12 + 11 + 11 + 9 + 11 + 11 + 12 + 12 + 8 + 10 + 9 + 10 + 11 + 11 + 10 + 9 + 9 + 12 + 10 + 11 + 10 + 8 + 8 + 9 + 9 + 9 + 9 + 12 + 12 + 12 + 9 + 9 + 9 + 9 + 10 + 8 + 9 + 9 + 11 + 9 + 10 + 10 + 8 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 10 + 10 + 9 + 9 + 11 + 9 + 9 + 10 + 8 + 9 + 9 + 9 + 10 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 11 + 8 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 11 + 8 + 9 + 9 + 9 + 8 + 8 + 10 + 6 + 9 + 9 + 10 + 10 + 9 + 10 + 7 + 9 + 9 + 10 + 8 + 9 + 10 + 8 + 11 + 10 + 8 + 9 + 9 + 9 + 7 + 9 + 9 + 10 + 10 + 9 + 10 + 9 + 8 + 9 + 10 + 9 + 9 + 10 + 8 + 8 + 9 + 9 + 10 + 9 + 8 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 5 + 9 + 9 + 10 + 7 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 10 + 11 + 9 + 9 + 9 + 8 + 9 + 10 + 9 + 9 + 9 + 8 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 10 + 11 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 8 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + + + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 9 + 10 + 9 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 12 + 12 + 12 + 12 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + + + + + + + GNSSALTTRK + #multiTrack + + absolute + 2022-07-16T19:41:31Z + 2022-07-16T19:41:46Z + 2022-07-16T19:42:01Z + 2022-07-16T19:42:16Z + 2022-07-16T19:42:22Z + 2022-07-16T19:42:27Z + 2022-07-16T19:42:32Z + 2022-07-16T19:42:37Z + 2022-07-16T19:42:42Z + 2022-07-16T19:42:47Z + 2022-07-16T19:42:52Z + 2022-07-16T19:42:57Z + 2022-07-16T19:43:02Z + 2022-07-16T19:43:07Z + 2022-07-16T19:43:13Z + 2022-07-16T19:43:17Z + 2022-07-16T19:43:22Z + 2022-07-16T19:43:27Z + 2022-07-16T19:43:32Z + 2022-07-16T19:43:38Z + 2022-07-16T19:43:42Z + 2022-07-16T19:43:47Z + 2022-07-16T19:43:52Z + 2022-07-16T19:43:58Z + 2022-07-16T19:44:03Z + 2022-07-16T19:44:08Z + 2022-07-16T19:44:13Z + 2022-07-16T19:44:18Z + 2022-07-16T19:44:23Z + 2022-07-16T19:44:28Z + 2022-07-16T19:44:33Z + 2022-07-16T19:44:38Z + 2022-07-16T19:44:43Z + 2022-07-16T19:44:48Z + 2022-07-16T19:44:53Z + 2022-07-16T19:44:58Z + 2022-07-16T19:45:03Z + 2022-07-16T19:45:08Z + 2022-07-16T19:45:13Z + 2022-07-16T19:45:18Z + 2022-07-16T19:45:23Z + 2022-07-16T19:45:28Z + 2022-07-16T19:45:33Z + 2022-07-16T19:45:38Z + 2022-07-16T19:45:43Z + 2022-07-16T19:45:48Z + 2022-07-16T19:45:53Z + 2022-07-16T19:45:58Z + 2022-07-16T19:46:03Z + 2022-07-16T19:46:08Z + 2022-07-16T19:46:13Z + 2022-07-16T19:46:18Z + 2022-07-16T19:46:23Z + 2022-07-16T19:46:28Z + 2022-07-16T19:46:33Z + 2022-07-16T19:46:38Z + 2022-07-16T19:46:43Z + 2022-07-16T19:46:48Z + 2022-07-16T19:46:53Z + 2022-07-16T19:46:58Z + 2022-07-16T19:47:03Z + 2022-07-16T19:47:08Z + 2022-07-16T19:47:13Z + 2022-07-16T19:47:18Z + 2022-07-16T19:47:23Z + 2022-07-16T19:47:28Z + 2022-07-16T19:47:33Z + 2022-07-16T19:47:39Z + 2022-07-16T19:47:44Z + 2022-07-16T19:47:49Z + 2022-07-16T19:47:53Z + 2022-07-16T19:47:59Z + 2022-07-16T19:48:03Z + 2022-07-16T19:48:09Z + 2022-07-16T19:48:14Z + 2022-07-16T19:48:19Z + 2022-07-16T19:48:24Z + 2022-07-16T19:48:29Z + 2022-07-16T19:48:34Z + 2022-07-16T19:48:39Z + 2022-07-16T19:48:44Z + 2022-07-16T19:48:49Z + 2022-07-16T19:48:54Z + 2022-07-16T19:48:59Z + 2022-07-16T19:49:04Z + 2022-07-16T19:49:09Z + 2022-07-16T19:49:14Z + 2022-07-16T19:49:19Z + 2022-07-16T19:49:24Z + 2022-07-16T19:49:29Z + 2022-07-16T19:49:34Z + 2022-07-16T19:49:39Z + 2022-07-16T19:49:44Z + 2022-07-16T19:49:49Z + 2022-07-16T19:49:54Z + 2022-07-16T19:49:59Z + 2022-07-16T19:50:04Z + 2022-07-16T19:50:09Z + 2022-07-16T19:50:14Z + 2022-07-16T19:50:19Z + 2022-07-16T19:50:24Z + 2022-07-16T19:50:29Z + 2022-07-16T19:50:34Z + 2022-07-16T19:50:40Z + 2022-07-16T19:50:45Z + 2022-07-16T19:50:50Z + 2022-07-16T19:50:55Z + 2022-07-16T19:51:00Z + 2022-07-16T19:51:05Z + 2022-07-16T19:51:10Z + 2022-07-16T19:51:15Z + 2022-07-16T19:51:20Z + 2022-07-16T19:51:25Z + 2022-07-16T19:51:30Z + 2022-07-16T19:51:35Z + 2022-07-16T19:51:40Z + 2022-07-16T19:51:45Z + 2022-07-16T19:51:50Z + 2022-07-16T19:51:55Z + 2022-07-16T19:52:00Z + 2022-07-16T19:52:05Z + 2022-07-16T19:52:10Z + 2022-07-16T19:52:15Z + 2022-07-16T19:52:20Z + 2022-07-16T19:52:25Z + 2022-07-16T19:52:30Z + 2022-07-16T19:52:35Z + 2022-07-16T19:52:40Z + 2022-07-16T19:52:45Z + 2022-07-16T19:52:50Z + 2022-07-16T19:52:55Z + 2022-07-16T19:53:00Z + 2022-07-16T19:53:05Z + 2022-07-16T19:53:10Z + 2022-07-16T19:53:15Z + 2022-07-16T19:53:20Z + 2022-07-16T19:53:25Z + 2022-07-16T19:53:30Z + 2022-07-16T19:53:35Z + 2022-07-16T19:53:40Z + 2022-07-16T19:53:45Z + 2022-07-16T19:53:50Z + 2022-07-16T19:53:55Z + 2022-07-16T19:54:00Z + 2022-07-16T19:54:05Z + 2022-07-16T19:54:11Z + 2022-07-16T19:54:16Z + 2022-07-16T19:54:21Z + 2022-07-16T19:54:26Z + 2022-07-16T19:54:31Z + 2022-07-16T19:54:36Z + 2022-07-16T19:54:41Z + 2022-07-16T19:54:46Z + 2022-07-16T19:54:51Z + 2022-07-16T19:54:56Z + 2022-07-16T19:55:01Z + 2022-07-16T19:55:06Z + 2022-07-16T19:55:11Z + 2022-07-16T19:55:16Z + 2022-07-16T19:55:21Z + 2022-07-16T19:55:26Z + 2022-07-16T19:55:31Z + 2022-07-16T19:55:36Z + 2022-07-16T19:55:41Z + 2022-07-16T19:55:46Z + 2022-07-16T19:55:51Z + 2022-07-16T19:55:56Z + 2022-07-16T19:56:01Z + 2022-07-16T19:56:06Z + 2022-07-16T19:56:11Z + 2022-07-16T19:56:16Z + 2022-07-16T19:56:21Z + 2022-07-16T19:56:26Z + 2022-07-16T19:56:31Z + 2022-07-16T19:56:36Z + 2022-07-16T19:56:41Z + 2022-07-16T19:56:46Z + 2022-07-16T19:56:51Z + 2022-07-16T19:56:56Z + 2022-07-16T19:57:01Z + 2022-07-16T19:57:06Z + 2022-07-16T19:57:11Z + 2022-07-16T19:57:16Z + 2022-07-16T19:57:21Z + 2022-07-16T19:57:26Z + 2022-07-16T19:57:31Z + 2022-07-16T19:57:36Z + 2022-07-16T19:57:41Z + 2022-07-16T19:57:46Z + 2022-07-16T19:57:51Z + 2022-07-16T19:57:56Z + 2022-07-16T19:58:01Z + 2022-07-16T19:58:06Z + 2022-07-16T19:58:11Z + 2022-07-16T19:58:16Z + 2022-07-16T19:58:21Z + 2022-07-16T19:58:26Z + 2022-07-16T19:58:31Z + 2022-07-16T19:58:36Z + 2022-07-16T19:58:41Z + 2022-07-16T19:58:46Z + 2022-07-16T19:58:51Z + 2022-07-16T19:58:56Z + 2022-07-16T19:59:01Z + 2022-07-16T19:59:06Z + 2022-07-16T19:59:11Z + 2022-07-16T19:59:16Z + 2022-07-16T19:59:21Z + 2022-07-16T19:59:26Z + 2022-07-16T19:59:31Z + 2022-07-16T19:59:36Z + 2022-07-16T19:59:41Z + 2022-07-16T19:59:46Z + 2022-07-16T19:59:51Z + 2022-07-16T19:59:56Z + 2022-07-16T20:00:01Z + 2022-07-16T20:00:06Z + 2022-07-16T20:00:11Z + 2022-07-16T20:00:16Z + 2022-07-16T20:00:21Z + 2022-07-16T20:00:26Z + 2022-07-16T20:00:31Z + 2022-07-16T20:00:36Z + 2022-07-16T20:00:41Z + 2022-07-16T20:00:46Z + 2022-07-16T20:00:51Z + 2022-07-16T20:00:56Z + 2022-07-16T20:01:01Z + 2022-07-16T20:01:06Z + 2022-07-16T20:01:11Z + 2022-07-16T20:01:16Z + 2022-07-16T20:01:21Z + 2022-07-16T20:01:26Z + 2022-07-16T20:01:31Z + 2022-07-16T20:01:36Z + 2022-07-16T20:01:41Z + 2022-07-16T20:01:46Z + 2022-07-16T20:01:51Z + 2022-07-16T20:01:56Z + 2022-07-16T20:02:01Z + 2022-07-16T20:02:06Z + 2022-07-16T20:02:11Z + 2022-07-16T20:02:16Z + 2022-07-16T20:02:21Z + 2022-07-16T20:02:26Z + 2022-07-16T20:02:31Z + 2022-07-16T20:02:36Z + 2022-07-16T20:02:41Z + 2022-07-16T20:02:46Z + 2022-07-16T20:02:51Z + 2022-07-16T20:02:56Z + 2022-07-16T20:03:01Z + 2022-07-16T20:03:06Z + 2022-07-16T20:03:11Z + 2022-07-16T20:03:16Z + 2022-07-16T20:03:22Z + 2022-07-16T20:03:27Z + 2022-07-16T20:03:32Z + 2022-07-16T20:03:37Z + 2022-07-16T20:03:42Z + 2022-07-16T20:03:47Z + 2022-07-16T20:03:52Z + 2022-07-16T20:03:57Z + 2022-07-16T20:04:02Z + 2022-07-16T20:04:07Z + 2022-07-16T20:04:12Z + 2022-07-16T20:04:17Z + 2022-07-16T20:04:22Z + 2022-07-16T20:04:27Z + 2022-07-16T20:04:32Z + 2022-07-16T20:04:37Z + 2022-07-16T20:04:42Z + 2022-07-16T20:04:47Z + 2022-07-16T20:04:52Z + 2022-07-16T20:04:57Z + 2022-07-16T20:05:02Z + 2022-07-16T20:05:07Z + 2022-07-16T20:05:12Z + 2022-07-16T20:05:17Z + 2022-07-16T20:05:22Z + 2022-07-16T20:05:27Z + 2022-07-16T20:05:32Z + 2022-07-16T20:05:37Z + 2022-07-16T20:05:42Z + 2022-07-16T20:05:47Z + 2022-07-16T20:05:52Z + 2022-07-16T20:05:57Z + 2022-07-16T20:06:02Z + 2022-07-16T20:06:07Z + 2022-07-16T20:06:12Z + 2022-07-16T20:06:17Z + 2022-07-16T20:06:22Z + 2022-07-16T20:06:27Z + 2022-07-16T20:06:32Z + 2022-07-16T20:06:37Z + 2022-07-16T20:06:42Z + 2022-07-16T20:06:47Z + 2022-07-16T20:06:52Z + 2022-07-16T20:06:57Z + 2022-07-16T20:07:02Z + 2022-07-16T20:07:07Z + 2022-07-16T20:07:12Z + 2022-07-16T20:07:17Z + 2022-07-16T20:07:22Z + 2022-07-16T20:07:27Z + 2022-07-16T20:07:32Z + 2022-07-16T20:07:37Z + 2022-07-16T20:07:42Z + 2022-07-16T20:07:47Z + 2022-07-16T20:07:52Z + 2022-07-16T20:07:57Z + 2022-07-16T20:08:02Z + 2022-07-16T20:08:07Z + 2022-07-16T20:08:12Z + 2022-07-16T20:08:17Z + 2022-07-16T20:08:22Z + 2022-07-16T20:08:27Z + 2022-07-16T20:08:32Z + 2022-07-16T20:08:37Z + 2022-07-16T20:08:42Z + 2022-07-16T20:08:47Z + 2022-07-16T20:08:52Z + 2022-07-16T20:08:57Z + 2022-07-16T20:09:02Z + 2022-07-16T20:09:07Z + 2022-07-16T20:09:12Z + 2022-07-16T20:09:17Z + 2022-07-16T20:09:22Z + 2022-07-16T20:09:27Z + 2022-07-16T20:09:32Z + 2022-07-16T20:09:37Z + 2022-07-16T20:09:42Z + 2022-07-16T20:09:47Z + 2022-07-16T20:09:52Z + 2022-07-16T20:09:57Z + 2022-07-16T20:10:02Z + 2022-07-16T20:10:07Z + 2022-07-16T20:10:12Z + 2022-07-16T20:10:17Z + 2022-07-16T20:10:22Z + 2022-07-16T20:10:27Z + 2022-07-16T20:10:32Z + 2022-07-16T20:10:37Z + 2022-07-16T20:10:42Z + 2022-07-16T20:10:47Z + 2022-07-16T20:10:52Z + 2022-07-16T20:10:57Z + 2022-07-16T20:11:02Z + 2022-07-16T20:11:07Z + 2022-07-16T20:11:12Z + 2022-07-16T20:11:17Z + 2022-07-16T20:11:22Z + 2022-07-16T20:11:27Z + 2022-07-16T20:11:32Z + 2022-07-16T20:11:37Z + 2022-07-16T20:11:42Z + 2022-07-16T20:11:47Z + 2022-07-16T20:11:52Z + 2022-07-16T20:11:57Z + 2022-07-16T20:12:02Z + 2022-07-16T20:12:07Z + 2022-07-16T20:12:12Z + 2022-07-16T20:12:17Z + 2022-07-16T20:12:22Z + 2022-07-16T20:12:27Z + 2022-07-16T20:12:32Z + 2022-07-16T20:12:37Z + 2022-07-16T20:12:42Z + 2022-07-16T20:12:47Z + 2022-07-16T20:12:52Z + 2022-07-16T20:12:57Z + 2022-07-16T20:13:02Z + 2022-07-16T20:13:07Z + 2022-07-16T20:13:12Z + 2022-07-16T20:13:17Z + 2022-07-16T20:13:22Z + 2022-07-16T20:13:27Z + 2022-07-16T20:13:32Z + 2022-07-16T20:13:37Z + 2022-07-16T20:13:42Z + 2022-07-16T20:13:47Z + 2022-07-16T20:13:52Z + 2022-07-16T20:13:57Z + 2022-07-16T20:14:02Z + 2022-07-16T20:14:07Z + 2022-07-16T20:14:12Z + 2022-07-16T20:14:17Z + 2022-07-16T20:14:22Z + 2022-07-16T20:14:27Z + 2022-07-16T20:14:32Z + 2022-07-16T20:14:37Z + 2022-07-16T20:14:42Z + 2022-07-16T20:14:47Z + 2022-07-16T20:14:52Z + 2022-07-16T20:14:57Z + 2022-07-16T20:15:02Z + 2022-07-16T20:15:07Z + 2022-07-16T20:15:12Z + 2022-07-16T20:15:17Z + 2022-07-16T20:15:22Z + 2022-07-16T20:15:27Z + 2022-07-16T20:15:32Z + 2022-07-16T20:15:37Z + 2022-07-16T20:15:42Z + 2022-07-16T20:15:47Z + 2022-07-16T20:15:52Z + 2022-07-16T20:15:57Z + 2022-07-16T20:16:02Z + 2022-07-16T20:16:07Z + 2022-07-16T20:16:12Z + 2022-07-16T20:16:17Z + 2022-07-16T20:16:22Z + 2022-07-16T20:16:27Z + 2022-07-16T20:16:33Z + 2022-07-16T20:16:38Z + 2022-07-16T20:16:43Z + 2022-07-16T20:16:48Z + 2022-07-16T20:16:53Z + 2022-07-16T20:16:58Z + 2022-07-16T20:17:03Z + 2022-07-16T20:17:08Z + 2022-07-16T20:17:13Z + 2022-07-16T20:17:18Z + 2022-07-16T20:17:23Z + 2022-07-16T20:17:28Z + 2022-07-16T20:17:33Z + 2022-07-16T20:17:38Z + 2022-07-16T20:17:43Z + 2022-07-16T20:17:48Z + 2022-07-16T20:17:53Z + 2022-07-16T20:17:58Z + 2022-07-16T20:18:03Z + 2022-07-16T20:18:08Z + 2022-07-16T20:18:13Z + 2022-07-16T20:18:18Z + 2022-07-16T20:18:23Z + 2022-07-16T20:18:28Z + 2022-07-16T20:18:33Z + 2022-07-16T20:18:38Z + 2022-07-16T20:18:43Z + 2022-07-16T20:18:48Z + 2022-07-16T20:18:53Z + 2022-07-16T20:18:58Z + 2022-07-16T20:19:03Z + 2022-07-16T20:19:08Z + 2022-07-16T20:19:13Z + 2022-07-16T20:19:18Z + 2022-07-16T20:19:23Z + 2022-07-16T20:19:28Z + 2022-07-16T20:19:33Z + 2022-07-16T20:19:38Z + 2022-07-16T20:19:43Z + 2022-07-16T20:19:48Z + 2022-07-16T20:19:53Z + 2022-07-16T20:19:58Z + 2022-07-16T20:20:03Z + 2022-07-16T20:20:08Z + 2022-07-16T20:20:13Z + 2022-07-16T20:20:18Z + 2022-07-16T20:20:23Z + 2022-07-16T20:20:28Z + 2022-07-16T20:20:33Z + 2022-07-16T20:20:38Z + 2022-07-16T20:20:43Z + 2022-07-16T20:20:48Z + 2022-07-16T20:20:53Z + 2022-07-16T20:20:58Z + 2022-07-16T20:21:03Z + 2022-07-16T20:21:08Z + 2022-07-16T20:21:13Z + 2022-07-16T20:21:18Z + 2022-07-16T20:21:23Z + 2022-07-16T20:21:28Z + 2022-07-16T20:21:33Z + 2022-07-16T20:21:38Z + 2022-07-16T20:21:43Z + 2022-07-16T20:21:48Z + 2022-07-16T20:21:53Z + 2022-07-16T20:21:58Z + 2022-07-16T20:22:03Z + 2022-07-16T20:22:08Z + 2022-07-16T20:22:13Z + 2022-07-16T20:22:18Z + 2022-07-16T20:22:23Z + 2022-07-16T20:22:28Z + 2022-07-16T20:22:33Z + 2022-07-16T20:22:38Z + 2022-07-16T20:22:43Z + 2022-07-16T20:22:48Z + 2022-07-16T20:22:53Z + 2022-07-16T20:22:58Z + 2022-07-16T20:23:03Z + 2022-07-16T20:23:08Z + 2022-07-16T20:23:13Z + 2022-07-16T20:23:18Z + 2022-07-16T20:23:23Z + 2022-07-16T20:23:28Z + 2022-07-16T20:23:33Z + 2022-07-16T20:23:38Z + 2022-07-16T20:23:43Z + 2022-07-16T20:23:48Z + 2022-07-16T20:23:53Z + 2022-07-16T20:23:58Z + 2022-07-16T20:24:03Z + 2022-07-16T20:24:08Z + 2022-07-16T20:24:13Z + 2022-07-16T20:24:18Z + 2022-07-16T20:24:23Z + 2022-07-16T20:24:28Z + 2022-07-16T20:24:33Z + 2022-07-16T20:24:38Z + 2022-07-16T20:24:43Z + 2022-07-16T20:24:48Z + 2022-07-16T20:24:53Z + 2022-07-16T20:24:58Z + 2022-07-16T20:25:03Z + 2022-07-16T20:25:08Z + 2022-07-16T20:25:13Z + 2022-07-16T20:25:18Z + 2022-07-16T20:25:23Z + 2022-07-16T20:25:28Z + 2022-07-16T20:25:33Z + 2022-07-16T20:25:38Z + 2022-07-16T20:25:43Z + 2022-07-16T20:25:48Z + 2022-07-16T20:25:53Z + 2022-07-16T20:25:58Z + 2022-07-16T20:26:03Z + 2022-07-16T20:26:08Z + 2022-07-16T20:26:13Z + 2022-07-16T20:26:18Z + 2022-07-16T20:26:23Z + 2022-07-16T20:26:28Z + 2022-07-16T20:26:33Z + 2022-07-16T20:26:38Z + 2022-07-16T20:26:43Z + 2022-07-16T20:26:48Z + 2022-07-16T20:26:53Z + 2022-07-16T20:26:58Z + 2022-07-16T20:27:03Z + 2022-07-16T20:27:08Z + 2022-07-16T20:27:13Z + 2022-07-16T20:27:18Z + 2022-07-16T20:27:23Z + 2022-07-16T20:27:28Z + 2022-07-16T20:27:33Z + 2022-07-16T20:27:38Z + 2022-07-16T20:27:43Z + 2022-07-16T20:27:48Z + 2022-07-16T20:27:53Z + 2022-07-16T20:27:58Z + 2022-07-16T20:28:03Z + 2022-07-16T20:28:08Z + 2022-07-16T20:28:13Z + 2022-07-16T20:28:18Z + 2022-07-16T20:28:23Z + 2022-07-16T20:28:28Z + 2022-07-16T20:28:33Z + 2022-07-16T20:28:38Z + 2022-07-16T20:28:43Z + 2022-07-16T20:28:48Z + 2022-07-16T20:28:53Z + 2022-07-16T20:28:58Z + 2022-07-16T20:29:03Z + 2022-07-16T20:29:09Z + 2022-07-16T20:29:13Z + 2022-07-16T20:29:19Z + 2022-07-16T20:29:24Z + 2022-07-16T20:29:29Z + 2022-07-16T20:29:34Z + 2022-07-16T20:29:39Z + 2022-07-16T20:29:44Z + 2022-07-16T20:29:49Z + 2022-07-16T20:29:54Z + 2022-07-16T20:29:59Z + 2022-07-16T20:30:04Z + 2022-07-16T20:30:09Z + 2022-07-16T20:30:14Z + 2022-07-16T20:30:19Z + 2022-07-16T20:30:24Z + 2022-07-16T20:30:29Z + 2022-07-16T20:30:34Z + 2022-07-16T20:30:39Z + 2022-07-16T20:30:44Z + 2022-07-16T20:30:49Z + 2022-07-16T20:30:54Z + 2022-07-16T20:30:59Z + 2022-07-16T20:31:04Z + 2022-07-16T20:31:09Z + 2022-07-16T20:31:14Z + 2022-07-16T20:31:19Z + 2022-07-16T20:31:24Z + 2022-07-16T20:31:29Z + 2022-07-16T20:31:34Z + 2022-07-16T20:31:39Z + 2022-07-16T20:31:44Z + 2022-07-16T20:31:49Z + 2022-07-16T20:31:54Z + 2022-07-16T20:31:59Z + 2022-07-16T20:32:04Z + 2022-07-16T20:32:09Z + 2022-07-16T20:32:14Z + 2022-07-16T20:32:19Z + 2022-07-16T20:32:24Z + 2022-07-16T20:32:29Z + 2022-07-16T20:32:34Z + 2022-07-16T20:32:39Z + 2022-07-16T20:32:44Z + 2022-07-16T20:32:49Z + 2022-07-16T20:32:54Z + 2022-07-16T20:32:59Z + 2022-07-16T20:33:04Z + 2022-07-16T20:33:09Z + 2022-07-16T20:33:14Z + 2022-07-16T20:33:19Z + 2022-07-16T20:33:24Z + 2022-07-16T20:33:29Z + 2022-07-16T20:33:34Z + 2022-07-16T20:33:39Z + 2022-07-16T20:33:44Z + 2022-07-16T20:33:49Z + 2022-07-16T20:33:54Z + 2022-07-16T20:33:59Z + 2022-07-16T20:34:04Z + 2022-07-16T20:34:09Z + 2022-07-16T20:34:14Z + 2022-07-16T20:34:19Z + 2022-07-16T20:34:24Z + 2022-07-16T20:34:29Z + 2022-07-16T20:34:34Z + 2022-07-16T20:34:39Z + 2022-07-16T20:34:44Z + 2022-07-16T20:34:49Z + 2022-07-16T20:34:54Z + 2022-07-16T20:34:59Z + 2022-07-16T20:35:04Z + 2022-07-16T20:35:09Z + 2022-07-16T20:35:14Z + 2022-07-16T20:35:19Z + 2022-07-16T20:35:24Z + 2022-07-16T20:35:29Z + 2022-07-16T20:35:34Z + 2022-07-16T20:35:39Z + 2022-07-16T20:35:44Z + 2022-07-16T20:35:49Z + 2022-07-16T20:35:54Z + 2022-07-16T20:35:59Z + 2022-07-16T20:36:04Z + 2022-07-16T20:36:09Z + 2022-07-16T20:36:14Z + 2022-07-16T20:36:19Z + 2022-07-16T20:36:24Z + 2022-07-16T20:36:29Z + 2022-07-16T20:36:34Z + 2022-07-16T20:36:39Z + 2022-07-16T20:36:44Z + 2022-07-16T20:36:49Z + 2022-07-16T20:36:54Z + 2022-07-16T20:36:59Z + 2022-07-16T20:37:04Z + 2022-07-16T20:37:09Z + 2022-07-16T20:37:14Z + 2022-07-16T20:37:19Z + 2022-07-16T20:37:24Z + 2022-07-16T20:37:29Z + 2022-07-16T20:37:34Z + 2022-07-16T20:37:39Z + 2022-07-16T20:37:44Z + 2022-07-16T20:37:49Z + 2022-07-16T20:37:54Z + 2022-07-16T20:37:59Z + 2022-07-16T20:38:04Z + 2022-07-16T20:38:09Z + 2022-07-16T20:38:14Z + 2022-07-16T20:38:19Z + 2022-07-16T20:38:24Z + 2022-07-16T20:38:29Z + 2022-07-16T20:38:34Z + 2022-07-16T20:38:39Z + 2022-07-16T20:38:44Z + 2022-07-16T20:38:49Z + 2022-07-16T20:38:54Z + 2022-07-16T20:38:59Z + 2022-07-16T20:39:05Z + 2022-07-16T20:39:10Z + 2022-07-16T20:39:15Z + 2022-07-16T20:39:20Z + 2022-07-16T20:39:25Z + 2022-07-16T20:39:30Z + 2022-07-16T20:39:35Z + 2022-07-16T20:39:40Z + 2022-07-16T20:39:45Z + 2022-07-16T20:39:50Z + 2022-07-16T20:39:55Z + 2022-07-16T20:40:00Z + 2022-07-16T20:40:05Z + 2022-07-16T20:40:10Z + 2022-07-16T20:40:15Z + 2022-07-16T20:40:20Z + 2022-07-16T20:40:25Z + 2022-07-16T20:40:30Z + 2022-07-16T20:40:35Z + 2022-07-16T20:40:40Z + 2022-07-16T20:40:45Z + 2022-07-16T20:40:50Z + 2022-07-16T20:40:55Z + 2022-07-16T20:41:00Z + 2022-07-16T20:41:05Z + 2022-07-16T20:41:10Z + 2022-07-16T20:41:15Z + 2022-07-16T20:41:20Z + 2022-07-16T20:41:25Z + 2022-07-16T20:41:30Z + 2022-07-16T20:41:35Z + 2022-07-16T20:41:40Z + 2022-07-16T20:41:45Z + 2022-07-16T20:41:50Z + 2022-07-16T20:41:55Z + 2022-07-16T20:42:00Z + 2022-07-16T20:42:05Z + 2022-07-16T20:42:10Z + 2022-07-16T20:42:15Z + 2022-07-16T20:42:20Z + 2022-07-16T20:42:25Z + 2022-07-16T20:42:30Z + 2022-07-16T20:42:35Z + 2022-07-16T20:42:40Z + 2022-07-16T20:42:45Z + 2022-07-16T20:42:50Z + 2022-07-16T20:42:55Z + 2022-07-16T20:43:00Z + 2022-07-16T20:43:05Z + 2022-07-16T20:43:10Z + 2022-07-16T20:43:15Z + 2022-07-16T20:43:20Z + 2022-07-16T20:43:25Z + 2022-07-16T20:43:30Z + 2022-07-16T20:43:35Z + 2022-07-16T20:43:40Z + 2022-07-16T20:43:45Z + 2022-07-16T20:43:50Z + 2022-07-16T20:43:55Z + 2022-07-16T20:44:00Z + 2022-07-16T20:44:05Z + 2022-07-16T20:44:10Z + 2022-07-16T20:44:15Z + 2022-07-16T20:44:20Z + 2022-07-16T20:44:25Z + 2022-07-16T20:44:30Z + 2022-07-16T20:44:35Z + 2022-07-16T20:44:40Z + 2022-07-16T20:44:45Z + 2022-07-16T20:44:50Z + 2022-07-16T20:44:55Z + 2022-07-16T20:45:00Z + 2022-07-16T20:45:05Z + 2022-07-16T20:45:10Z + 2022-07-16T20:45:15Z + 2022-07-16T20:45:20Z + 2022-07-16T20:45:25Z + 2022-07-16T20:45:30Z + 2022-07-16T20:45:35Z + 2022-07-16T20:45:40Z + 2022-07-16T20:45:45Z + 2022-07-16T20:45:50Z + 2022-07-16T20:45:55Z + 2022-07-16T20:46:00Z + 2022-07-16T20:46:05Z + 2022-07-16T20:46:10Z + 2022-07-16T20:46:15Z + 2022-07-16T20:46:20Z + 2022-07-16T20:46:25Z + 2022-07-16T20:46:30Z + 2022-07-16T20:46:35Z + 2022-07-16T20:46:40Z + 2022-07-16T20:46:45Z + 2022-07-16T20:46:50Z + 2022-07-16T20:46:55Z + 2022-07-16T20:47:00Z + 2022-07-16T20:47:05Z + 2022-07-16T20:47:10Z + 2022-07-16T20:47:15Z + 2022-07-16T20:47:20Z + 2022-07-16T20:47:25Z + 2022-07-16T20:47:30Z + 2022-07-16T20:47:35Z + 2022-07-16T20:47:40Z + 2022-07-16T20:47:45Z + 2022-07-16T20:47:50Z + 2022-07-16T20:47:55Z + 2022-07-16T20:48:00Z + 2022-07-16T20:48:05Z + 2022-07-16T20:48:10Z + 2022-07-16T20:48:15Z + 2022-07-16T20:48:20Z + 2022-07-16T20:48:25Z + 2022-07-16T20:48:30Z + 2022-07-16T20:48:35Z + 2022-07-16T20:48:40Z + 2022-07-16T20:48:45Z + 2022-07-16T20:48:50Z + 2022-07-16T20:48:55Z + 2022-07-16T20:49:00Z + 2022-07-16T20:49:05Z + 2022-07-16T20:49:10Z + 2022-07-16T20:49:15Z + 2022-07-16T20:49:20Z + 2022-07-16T20:49:25Z + 2022-07-16T20:49:31Z + 2022-07-16T20:49:36Z + 2022-07-16T20:49:41Z + 2022-07-16T20:49:46Z + 2022-07-16T20:49:51Z + 2022-07-16T20:49:56Z + 2022-07-16T20:50:01Z + 2022-07-16T20:50:06Z + 2022-07-16T20:50:11Z + 2022-07-16T20:50:16Z + 2022-07-16T20:50:21Z + 2022-07-16T20:50:26Z + 2022-07-16T20:50:31Z + 2022-07-16T20:50:36Z + 2022-07-16T20:50:41Z + 2022-07-16T20:50:46Z + 2022-07-16T20:50:51Z + 2022-07-16T20:50:56Z + 2022-07-16T20:51:01Z + 2022-07-16T20:51:06Z + 2022-07-16T20:51:11Z + 2022-07-16T20:51:16Z + 2022-07-16T20:51:21Z + 2022-07-16T20:51:26Z + 2022-07-16T20:51:31Z + 2022-07-16T20:51:36Z + 2022-07-16T20:51:41Z + 2022-07-16T20:51:46Z + 2022-07-16T20:51:51Z + 2022-07-16T20:51:56Z + 2022-07-16T20:52:01Z + 2022-07-16T20:52:06Z + 2022-07-16T20:52:11Z + 2022-07-16T20:52:16Z + 2022-07-16T20:52:21Z + 2022-07-16T20:52:26Z + 2022-07-16T20:52:31Z + 2022-07-16T20:52:36Z + 2022-07-16T20:52:41Z + 2022-07-16T20:52:46Z + 2022-07-16T20:52:51Z + 2022-07-16T20:52:56Z + 2022-07-16T20:53:01Z + 2022-07-16T20:53:06Z + 2022-07-16T20:53:11Z + 2022-07-16T20:53:16Z + 2022-07-16T20:53:21Z + 2022-07-16T20:53:26Z + 2022-07-16T20:53:31Z + 2022-07-16T20:53:36Z + 2022-07-16T20:53:41Z + 2022-07-16T20:53:46Z + 2022-07-16T20:53:51Z + 2022-07-16T20:53:56Z + 2022-07-16T20:54:01Z + 2022-07-16T20:54:06Z + 2022-07-16T20:54:11Z + 2022-07-16T20:54:16Z + 2022-07-16T20:54:21Z + 2022-07-16T20:54:26Z + 2022-07-16T20:54:31Z + 2022-07-16T20:54:36Z + 2022-07-16T20:54:41Z + 2022-07-16T20:54:46Z + 2022-07-16T20:54:51Z + 2022-07-16T20:54:56Z + 2022-07-16T20:55:01Z + 2022-07-16T20:55:06Z + 2022-07-16T20:55:11Z + 2022-07-16T20:55:16Z + 2022-07-16T20:55:21Z + 2022-07-16T20:55:26Z + 2022-07-16T20:55:31Z + 2022-07-16T20:55:36Z + 2022-07-16T20:55:41Z + 2022-07-16T20:55:46Z + 2022-07-16T20:55:51Z + 2022-07-16T20:55:56Z + 2022-07-16T20:56:01Z + 2022-07-16T20:56:06Z + 2022-07-16T20:56:11Z + 2022-07-16T20:56:16Z + 2022-07-16T20:56:21Z + 2022-07-16T20:56:26Z + 2022-07-16T20:56:31Z + 2022-07-16T20:56:36Z + 2022-07-16T20:56:41Z + 2022-07-16T20:56:46Z + 2022-07-16T20:56:51Z + 2022-07-16T20:56:56Z + 2022-07-16T20:57:01Z + 2022-07-16T20:57:06Z + 2022-07-16T20:57:11Z + 2022-07-16T20:57:16Z + 2022-07-16T20:57:21Z + 2022-07-16T20:57:26Z + 2022-07-16T20:57:31Z + 2022-07-16T20:57:36Z + 2022-07-16T20:57:41Z + 2022-07-16T20:57:46Z + 2022-07-16T20:57:51Z + 2022-07-16T20:57:56Z + 2022-07-16T20:58:01Z + 2022-07-16T20:58:06Z + 2022-07-16T20:58:11Z + 2022-07-16T20:58:16Z + 2022-07-16T20:58:21Z + 2022-07-16T20:58:26Z + 2022-07-16T20:58:31Z + 2022-07-16T20:58:36Z + 2022-07-16T20:58:41Z + 2022-07-16T20:58:46Z + 2022-07-16T20:58:51Z + 2022-07-16T20:58:56Z + 2022-07-16T20:59:01Z + 2022-07-16T20:59:06Z + 2022-07-16T20:59:11Z + 2022-07-16T20:59:16Z + 2022-07-16T20:59:21Z + 2022-07-16T20:59:26Z + 2022-07-16T20:59:31Z + 2022-07-16T20:59:36Z + 2022-07-16T20:59:41Z + 2022-07-16T20:59:46Z + 2022-07-16T20:59:51Z + 2022-07-16T20:59:56Z + 2022-07-16T21:00:01Z + 2022-07-16T21:00:06Z + 2022-07-16T21:00:11Z + 2022-07-16T21:00:16Z + 2022-07-16T21:00:21Z + 2022-07-16T21:00:26Z + 2022-07-16T21:00:32Z + 2022-07-16T21:00:37Z + 2022-07-16T21:00:42Z + 2022-07-16T21:00:47Z + 2022-07-16T21:00:52Z + 2022-07-16T21:00:57Z + 2022-07-16T21:01:02Z + 2022-07-16T21:01:07Z + 2022-07-16T21:01:12Z + 2022-07-16T21:01:17Z + 2022-07-16T21:01:22Z + 2022-07-16T21:01:27Z + 2022-07-16T21:01:32Z + 2022-07-16T21:01:37Z + 2022-07-16T21:01:42Z + 2022-07-16T21:01:47Z + 2022-07-16T21:01:52Z + 2022-07-16T21:01:57Z + 2022-07-16T21:02:02Z + 2022-07-16T21:02:07Z + 2022-07-16T21:02:12Z + 2022-07-16T21:02:17Z + 2022-07-16T21:02:22Z + 2022-07-16T21:02:27Z + 2022-07-16T21:02:32Z + 2022-07-16T21:02:37Z + 2022-07-16T21:02:42Z + 2022-07-16T21:02:47Z + 2022-07-16T21:02:52Z + 2022-07-16T21:02:57Z + 2022-07-16T21:03:02Z + 2022-07-16T21:03:07Z + 2022-07-16T21:03:12Z + 2022-07-16T21:03:17Z + 2022-07-16T21:03:22Z + 2022-07-16T21:03:27Z + 2022-07-16T21:03:32Z + 2022-07-16T21:03:37Z + 2022-07-16T21:03:42Z + 2022-07-16T21:03:47Z + 2022-07-16T21:03:52Z + 2022-07-16T21:03:57Z + 2022-07-16T21:04:02Z + 2022-07-16T21:04:07Z + 2022-07-16T21:04:12Z + 2022-07-16T21:04:17Z + 2022-07-16T21:04:22Z + 2022-07-16T21:04:27Z + 2022-07-16T21:04:32Z + 2022-07-16T21:04:37Z + 2022-07-16T21:04:42Z + 2022-07-16T21:04:47Z + 2022-07-16T21:04:52Z + 2022-07-16T21:04:57Z + 2022-07-16T21:05:02Z + 2022-07-16T21:05:07Z + 2022-07-16T21:05:12Z + 2022-07-16T21:05:17Z + 2022-07-16T21:05:22Z + 2022-07-16T21:05:28Z + 2022-07-16T21:05:33Z + 2022-07-16T21:05:38Z + 2022-07-16T21:05:43Z + 2022-07-16T21:05:48Z + 2022-07-16T21:05:53Z + 2022-07-16T21:05:58Z + 2022-07-16T21:06:03Z + 2022-07-16T21:06:08Z + 2022-07-16T21:06:13Z + 2022-07-16T21:06:18Z + 2022-07-16T21:06:23Z + 2022-07-16T21:06:28Z + 2022-07-16T21:06:33Z + 2022-07-16T21:06:38Z + 2022-07-16T21:06:43Z + 2022-07-16T21:06:48Z + 2022-07-16T21:06:53Z + 2022-07-16T21:06:58Z + 2022-07-16T21:07:03Z + 2022-07-16T21:07:08Z + 2022-07-16T21:07:13Z + 2022-07-16T21:07:19Z + 2022-07-16T21:07:24Z + 2022-07-16T21:07:28Z + 2022-07-16T21:07:34Z + 2022-07-16T21:07:39Z + 2022-07-16T21:07:44Z + 2022-07-16T21:07:49Z + 2022-07-16T21:07:54Z + 2022-07-16T21:07:59Z + 2022-07-16T21:08:04Z + 2022-07-16T21:08:09Z + 2022-07-16T21:08:14Z + 2022-07-16T21:08:19Z + 2022-07-16T21:08:24Z + 2022-07-16T21:08:29Z + 2022-07-16T21:08:34Z + 2022-07-16T21:08:39Z + 2022-07-16T21:08:44Z + 2022-07-16T21:08:49Z + 2022-07-16T21:08:54Z + 2022-07-16T21:08:59Z + 2022-07-16T21:09:04Z + 2022-07-16T21:09:09Z + 2022-07-16T21:09:14Z + 2022-07-16T21:09:19Z + 2022-07-16T21:09:24Z + 2022-07-16T21:09:29Z + 2022-07-16T21:09:34Z + 2022-07-16T21:09:39Z + 2022-07-16T21:09:44Z + 2022-07-16T21:09:49Z + 2022-07-16T21:09:54Z + 2022-07-16T21:10:00Z + 2022-07-16T21:10:05Z + 2022-07-16T21:10:10Z + 2022-07-16T21:10:15Z + 2022-07-16T21:10:20Z + 2022-07-16T21:10:25Z + 2022-07-16T21:10:30Z + 2022-07-16T21:10:35Z + 2022-07-16T21:10:40Z + 2022-07-16T21:10:45Z + 2022-07-16T21:10:50Z + 2022-07-16T21:10:55Z + 2022-07-16T21:11:00Z + 2022-07-16T21:11:05Z + 2022-07-16T21:11:10Z + 2022-07-16T21:11:15Z + 2022-07-16T21:11:20Z + -80.443083 43.840333 463.00 + -80.443083 43.840333 463.00 + -80.443083 43.840333 463.00 + -80.442617 43.839933 463.00 + -80.441667 43.839200 463.00 + -80.440567 43.838433 464.00 + -80.439233 43.837517 466.00 + -80.437850 43.836533 484.00 + -80.436450 43.835600 503.00 + -80.435117 43.834700 524.00 + -80.433833 43.833833 543.00 + -80.432483 43.833000 557.00 + -80.431400 43.832050 574.00 + -80.430767 43.830933 584.00 + -80.430767 43.829700 590.00 + -80.431133 43.828533 601.00 + -80.431967 43.827483 611.00 + -80.433300 43.826650 626.00 + -80.434950 43.826117 638.00 + -80.436800 43.825667 656.00 + -80.438317 43.825250 672.00 + -80.440050 43.825017 687.00 + -80.441817 43.825250 697.00 + -80.443417 43.825967 702.00 + -80.444700 43.827117 709.00 + -80.445300 43.828633 719.00 + -80.445100 43.830217 738.00 + -80.444250 43.831683 748.00 + -80.442550 43.832883 755.00 + -80.440667 43.833500 765.00 + -80.438600 43.833683 773.00 + -80.436650 43.833267 782.00 + -80.435117 43.832383 790.00 + -80.434150 43.831200 799.00 + -80.433833 43.829900 811.00 + -80.434267 43.828650 820.00 + -80.435350 43.827617 834.00 + -80.436817 43.826950 856.00 + -80.438400 43.826483 869.00 + -80.439983 43.826083 879.00 + -80.441567 43.825700 888.00 + -80.443217 43.825317 895.00 + -80.444850 43.824883 917.00 + -80.446267 43.824200 936.00 + -80.447117 43.823100 952.00 + -80.447167 43.821850 970.00 + -80.446417 43.820617 972.00 + -80.444900 43.819717 978.00 + -80.442883 43.819250 986.00 + -80.440683 43.819350 1000.00 + -80.438333 43.820033 1011.00 + -80.436700 43.821067 1024.00 + -80.434900 43.822217 1045.00 + -80.432783 43.822983 1057.00 + -80.430450 43.823183 1068.00 + -80.428217 43.822950 1082.00 + -80.426083 43.822233 1099.00 + -80.424683 43.821150 1116.00 + -80.423833 43.819800 1124.00 + -80.423767 43.818350 1135.00 + -80.424400 43.817033 1155.00 + -80.425667 43.816033 1160.00 + -80.427400 43.815400 1168.00 + -80.429400 43.815200 1177.00 + -80.431450 43.815367 1194.00 + -80.433483 43.815633 1213.00 + -80.435483 43.815517 1233.00 + -80.437300 43.814950 1252.00 + -80.438550 43.813850 1276.00 + -80.438850 43.812467 1296.00 + -80.438283 43.811150 1323.00 + -80.437033 43.810083 1349.00 + -80.435283 43.809367 1375.00 + -80.432900 43.809350 1391.00 + -80.430750 43.809950 1410.00 + -80.429117 43.809300 1414.00 + -80.427983 43.808300 1417.00 + -80.427067 43.807283 1412.00 + -80.425767 43.806633 1407.00 + -80.424533 43.807233 1402.00 + -80.424433 43.808267 1400.00 + -80.425217 43.809133 1395.00 + -80.426517 43.809633 1394.00 + -80.428017 43.809800 1393.00 + -80.429567 43.809767 1384.00 + -80.431083 43.809567 1383.00 + -80.432583 43.809317 1389.00 + -80.434083 43.808967 1400.00 + -80.434733 43.808067 1415.00 + -80.433900 43.807333 1425.00 + -80.432517 43.807600 1440.00 + -80.431917 43.808567 1451.00 + -80.432533 43.809533 1459.00 + -80.433900 43.809750 1470.00 + -80.434967 43.809000 1479.00 + -80.434883 43.808033 1494.00 + -80.433683 43.807633 1508.00 + -80.432600 43.808233 1527.00 + -80.432683 43.809283 1533.00 + -80.433933 43.809817 1545.00 + -80.435117 43.809400 1560.00 + -80.435283 43.808483 1565.00 + -80.434300 43.807800 1577.00 + -80.432933 43.807950 1596.00 + -80.432150 43.808833 1612.00 + -80.432667 43.809950 1617.00 + -80.434017 43.810300 1631.00 + -80.435250 43.809933 1643.00 + -80.436217 43.809083 1659.00 + -80.435717 43.808200 1670.00 + -80.434367 43.808000 1676.00 + -80.433183 43.808700 1693.00 + -80.433233 43.809800 1712.00 + -80.434617 43.810167 1724.00 + -80.435617 43.809400 1738.00 + -80.435033 43.808533 1750.00 + -80.433600 43.808583 1753.00 + -80.432950 43.809700 1773.00 + -80.433483 43.810800 1787.00 + -80.435017 43.811067 1800.00 + -80.436033 43.810283 1813.00 + -80.435650 43.809317 1822.00 + -80.434000 43.809100 1829.00 + -80.432850 43.809933 1847.00 + -80.432517 43.811067 1862.00 + -80.433733 43.811683 1872.00 + -80.434950 43.811167 1883.00 + -80.434833 43.810183 1896.00 + -80.433483 43.809817 1900.00 + -80.432267 43.810533 1919.00 + -80.432500 43.811567 1935.00 + -80.433817 43.811933 1943.00 + -80.434867 43.811283 1955.00 + -80.434717 43.810367 1968.00 + -80.433517 43.809850 1978.00 + -80.432033 43.810100 1993.00 + -80.431267 43.811050 2001.00 + -80.431600 43.812083 2002.00 + -80.432783 43.812750 2000.00 + -80.434267 43.812533 2007.00 + -80.434917 43.811567 2019.00 + -80.434283 43.810550 2029.00 + -80.432750 43.810283 2051.00 + -80.431500 43.810967 2065.00 + -80.431317 43.812017 2072.00 + -80.432133 43.812850 2071.00 + -80.433450 43.813300 2079.00 + -80.434850 43.813383 2092.00 + -80.435733 43.812700 2093.00 + -80.435333 43.811700 2090.00 + -80.433933 43.811300 2098.00 + -80.432483 43.811700 2117.00 + -80.432167 43.812750 2122.00 + -80.433300 43.813467 2133.00 + -80.434483 43.813100 2144.00 + -80.434733 43.812217 2149.00 + -80.433833 43.811417 2150.00 + -80.432450 43.811633 2172.00 + -80.431950 43.812650 2170.00 + -80.432867 43.813567 2183.00 + -80.434233 43.813417 2198.00 + -80.434767 43.812550 2200.00 + -80.434017 43.811700 2211.00 + -80.432517 43.811800 2223.00 + -80.431917 43.812883 2230.00 + -80.432817 43.813767 2239.00 + -80.434117 43.813517 2253.00 + -80.434300 43.812600 2254.00 + -80.433133 43.812000 2271.00 + -80.431817 43.812517 2277.00 + -80.431600 43.813667 2284.00 + -80.432667 43.814417 2292.00 + -80.433900 43.814017 2300.00 + -80.434000 43.813067 2300.00 + -80.432650 43.812833 2315.00 + -80.431700 43.813650 2312.00 + -80.432317 43.814683 2314.00 + -80.433767 43.815017 2319.00 + -80.435250 43.814850 2316.00 + -80.436467 43.814283 2307.00 + -80.436550 43.813300 2304.00 + -80.435483 43.812550 2315.00 + -80.434117 43.812117 2311.00 + -80.432633 43.812583 2310.00 + -80.432300 43.813750 2320.00 + -80.433433 43.814467 2322.00 + -80.434767 43.814050 2324.00 + -80.434717 43.813033 2335.00 + -80.433383 43.812633 2337.00 + -80.432083 43.813150 2328.00 + -80.432117 43.814433 2329.00 + -80.432550 43.815750 2321.00 + -80.433067 43.817150 2315.00 + -80.433650 43.818650 2314.00 + -80.434467 43.820100 2322.00 + -80.435967 43.820100 2343.00 + -80.436100 43.819167 2341.00 + -80.435233 43.818217 2318.00 + -80.433733 43.817283 2307.00 + -80.432033 43.816450 2305.00 + -80.430167 43.815717 2301.00 + -80.428183 43.815050 2297.00 + -80.426133 43.814483 2292.00 + -80.424017 43.813967 2284.00 + -80.421867 43.813417 2286.00 + -80.420200 43.812900 2322.00 + -80.418750 43.812450 2311.00 + -80.417233 43.811883 2310.00 + -80.415567 43.811367 2300.00 + -80.413683 43.810767 2287.00 + -80.411750 43.810050 2278.00 + -80.409733 43.809367 2269.00 + -80.407667 43.808667 2258.00 + -80.405600 43.807817 2246.00 + -80.403567 43.806883 2240.00 + -80.401533 43.805983 2235.00 + -80.399700 43.805167 2251.00 + -80.397983 43.804483 2246.00 + -80.396000 43.803917 2223.00 + -80.393850 43.803217 2208.00 + -80.391833 43.802383 2204.00 + -80.390033 43.801517 2200.00 + -80.388400 43.800600 2197.00 + -80.386883 43.799633 2192.00 + -80.385317 43.798533 2186.00 + -80.383900 43.797517 2178.00 + -80.382517 43.796450 2178.00 + -80.381283 43.795317 2180.00 + -80.380267 43.794083 2197.00 + -80.379533 43.792983 2210.00 + -80.378967 43.791983 2208.00 + -80.378450 43.790883 2193.00 + -80.377833 43.789633 2181.00 + -80.377183 43.788300 2171.00 + -80.376517 43.786900 2163.00 + -80.375850 43.785467 2147.00 + -80.375217 43.783933 2138.00 + -80.374633 43.782500 2140.00 + -80.374117 43.781100 2132.00 + -80.373717 43.779650 2120.00 + -80.373333 43.778150 2106.00 + -80.373000 43.776583 2090.00 + -80.372633 43.774950 2078.00 + -80.372267 43.773317 2069.00 + -80.371933 43.771733 2073.00 + -80.371617 43.770217 2071.00 + -80.371150 43.768733 2068.00 + -80.370617 43.767300 2064.00 + -80.370033 43.765850 2052.00 + -80.369367 43.764333 2039.00 + -80.368717 43.762750 2025.00 + -80.368050 43.761083 2014.00 + -80.367367 43.759417 2004.00 + -80.366800 43.757733 2000.00 + -80.366283 43.756100 1992.00 + -80.365783 43.754467 1985.00 + -80.365367 43.752833 1978.00 + -80.364917 43.751200 1961.00 + -80.364450 43.749517 1957.00 + -80.363883 43.747783 1951.00 + -80.363350 43.746083 1955.00 + -80.362750 43.744417 1955.00 + -80.362200 43.742750 1956.00 + -80.361567 43.741083 1950.00 + -80.360983 43.739400 1936.00 + -80.360383 43.737667 1926.00 + -80.359733 43.735950 1919.00 + -80.359050 43.734200 1904.00 + -80.358317 43.732417 1893.00 + -80.357617 43.730483 1899.00 + -80.357033 43.728850 1899.00 + -80.356500 43.727217 1891.00 + -80.355983 43.725550 1880.00 + -80.355350 43.723833 1865.00 + -80.354700 43.722133 1851.00 + -80.354083 43.720483 1842.00 + -80.353583 43.718900 1836.00 + -80.353150 43.717333 1828.00 + -80.352650 43.715750 1813.00 + -80.352000 43.714067 1798.00 + -80.351183 43.712400 1792.00 + -80.350367 43.710750 1788.00 + -80.349417 43.709217 1793.00 + -80.348567 43.707833 1809.00 + -80.347850 43.706617 1816.00 + -80.346983 43.705567 1810.00 + -80.346517 43.704450 1807.00 + -80.347133 43.703383 1804.00 + -80.348217 43.702467 1814.00 + -80.349300 43.701550 1812.00 + -80.350450 43.700683 1805.00 + -80.351683 43.699867 1795.00 + -80.352967 43.699033 1782.00 + -80.354367 43.698200 1772.00 + -80.355867 43.697400 1764.00 + -80.357267 43.696533 1762.00 + -80.358633 43.695717 1753.00 + -80.359983 43.694967 1747.00 + -80.361317 43.694167 1738.00 + -80.362583 43.693250 1732.00 + -80.363833 43.692283 1732.00 + -80.365100 43.691367 1738.00 + -80.366250 43.690450 1744.00 + -80.367400 43.689550 1749.00 + -80.368283 43.688550 1758.00 + -80.367300 43.687633 1771.00 + -80.365600 43.687550 1784.00 + -80.364500 43.688450 1796.00 + -80.364900 43.689467 1802.00 + -80.366100 43.689900 1806.00 + -80.367183 43.689550 1808.00 + -80.367983 43.688800 1804.00 + -80.368633 43.687900 1801.00 + -80.369267 43.686917 1809.00 + -80.369983 43.685883 1814.00 + -80.369617 43.684767 1829.00 + -80.368050 43.684667 1834.00 + -80.367250 43.685667 1838.00 + -80.368033 43.686633 1853.00 + -80.369367 43.686833 1870.00 + -80.369500 43.685817 1880.00 + -80.368050 43.685450 1888.00 + -80.366983 43.686317 1893.00 + -80.367450 43.687450 1914.00 + -80.368683 43.687833 1927.00 + -80.369167 43.686833 1936.00 + -80.368133 43.685917 1955.00 + -80.366500 43.685933 1967.00 + -80.365517 43.686883 1981.00 + -80.366150 43.687817 1999.00 + -80.367383 43.687667 2015.00 + -80.367483 43.686750 2032.00 + -80.366167 43.686217 2031.00 + -80.365267 43.687250 2035.00 + -80.366250 43.688050 2055.00 + -80.367550 43.687867 2069.00 + -80.367517 43.686917 2081.00 + -80.366083 43.686533 2088.00 + -80.364700 43.687183 2094.00 + -80.364267 43.688350 2104.00 + -80.364617 43.689517 2118.00 + -80.365867 43.690117 2135.00 + -80.366983 43.689567 2132.00 + -80.366717 43.688517 2150.00 + -80.365267 43.688317 2167.00 + -80.364017 43.689133 2165.00 + -80.364117 43.690333 2186.00 + -80.364917 43.691217 2185.00 + -80.366333 43.691267 2187.00 + -80.367100 43.690400 2188.00 + -80.367033 43.689267 2201.00 + -80.365683 43.688767 2214.00 + -80.364567 43.689583 2218.00 + -80.365217 43.690467 2231.00 + -80.366500 43.690333 2238.00 + -80.366967 43.689433 2255.00 + -80.366333 43.688550 2257.00 + -80.364783 43.688167 2267.00 + -80.363500 43.688717 2274.00 + -80.363200 43.689833 2258.00 + -80.363667 43.690933 2267.00 + -80.364467 43.691900 2273.00 + -80.365433 43.692750 2272.00 + -80.366800 43.692783 2265.00 + -80.367183 43.691783 2271.00 + -80.366267 43.690900 2285.00 + -80.364750 43.690600 2290.00 + -80.363100 43.690967 2303.00 + -80.361700 43.691650 2315.00 + -80.360750 43.692650 2319.00 + -80.361067 43.693750 2320.00 + -80.362450 43.694067 2314.00 + -80.363417 43.693350 2315.00 + -80.363200 43.692317 2317.00 + -80.361917 43.691600 2328.00 + -80.360317 43.691600 2336.00 + -80.358933 43.692300 2323.00 + -80.358833 43.693467 2332.00 + -80.360000 43.694067 2330.00 + -80.361533 43.694000 2325.00 + -80.362967 43.694000 2331.00 + -80.364383 43.693883 2331.00 + -80.365833 43.693700 2333.00 + -80.367333 43.693500 2346.00 + -80.368850 43.693317 2345.00 + -80.370533 43.693117 2345.00 + -80.372367 43.692817 2346.00 + -80.374183 43.692600 2352.00 + -80.375767 43.692517 2346.00 + -80.377450 43.692317 2326.00 + -80.379383 43.692017 2313.00 + -80.381383 43.691617 2308.00 + -80.383067 43.691167 2321.00 + -80.384517 43.690900 2322.00 + -80.385933 43.690600 2315.00 + -80.387383 43.690300 2308.00 + -80.388767 43.689917 2303.00 + -80.390167 43.689417 2293.00 + -80.391733 43.688967 2285.00 + -80.393350 43.688550 2285.00 + -80.394967 43.688200 2286.00 + -80.396533 43.687967 2283.00 + -80.398150 43.687783 2274.00 + -80.399833 43.687933 2270.00 + -80.401533 43.688150 2257.00 + -80.403333 43.688333 2245.00 + -80.405200 43.688550 2238.00 + -80.407017 43.688750 2236.00 + -80.408817 43.688933 2229.00 + -80.410733 43.689050 2218.00 + -80.412700 43.689217 2200.00 + -80.414783 43.689383 2185.00 + -80.416933 43.689467 2179.00 + -80.419050 43.689550 2168.00 + -80.421250 43.689633 2160.00 + -80.423350 43.689733 2161.00 + -80.425350 43.689800 2158.00 + -80.427233 43.689767 2157.00 + -80.429050 43.689750 2154.00 + -80.430717 43.689817 2157.00 + -80.432267 43.689700 2152.00 + -80.433717 43.689300 2146.00 + -80.435117 43.688617 2145.00 + -80.436383 43.687783 2152.00 + -80.437567 43.686700 2164.00 + -80.437483 43.685500 2187.00 + -80.436067 43.685533 2180.00 + -80.435817 43.686817 2164.00 + -80.436817 43.687933 2185.00 + -80.438267 43.688700 2200.00 + -80.439383 43.688033 2210.00 + -80.438317 43.687400 2211.00 + -80.437967 43.688667 2224.00 + -80.439433 43.689267 2248.00 + -80.440600 43.688600 2250.00 + -80.440100 43.687650 2256.00 + -80.438650 43.687383 2264.00 + -80.437233 43.687717 2286.00 + -80.436233 43.688467 2298.00 + -80.436633 43.689533 2311.00 + -80.437950 43.689933 2321.00 + -80.439050 43.689333 2321.00 + -80.439017 43.688250 2323.00 + -80.438000 43.687433 2335.00 + -80.436633 43.687017 2350.00 + -80.435417 43.687550 2351.00 + -80.435683 43.688650 2359.00 + -80.437017 43.689217 2373.00 + -80.438483 43.689117 2381.00 + -80.439583 43.688383 2380.00 + -80.438783 43.687517 2376.00 + -80.437600 43.688267 2385.00 + -80.437433 43.689500 2391.00 + -80.437600 43.690850 2390.00 + -80.437917 43.692167 2400.00 + -80.438350 43.693350 2409.00 + -80.438733 43.694550 2405.00 + -80.439133 43.695983 2395.00 + -80.439617 43.697583 2393.00 + -80.440233 43.699150 2384.00 + -80.440617 43.700883 2365.00 + -80.440817 43.702817 2342.00 + -80.440933 43.704917 2315.00 + -80.441017 43.707200 2286.00 + -80.441067 43.709483 2283.00 + -80.441067 43.711700 2273.00 + -80.441067 43.713883 2268.00 + -80.441083 43.715967 2270.00 + -80.441100 43.717900 2271.00 + -80.441067 43.719767 2268.00 + -80.441067 43.721600 2257.00 + -80.441033 43.723433 2250.00 + -80.441083 43.725267 2243.00 + -80.441150 43.727050 2246.00 + -80.441150 43.728750 2248.00 + -80.441067 43.730500 2236.00 + -80.441017 43.732283 2221.00 + -80.441083 43.734167 2210.00 + -80.441117 43.736100 2198.00 + -80.441000 43.738000 2188.00 + -80.440817 43.739817 2190.00 + -80.440683 43.741550 2183.00 + -80.440533 43.743333 2174.00 + -80.440433 43.745150 2179.00 + -80.440317 43.746883 2182.00 + -80.440217 43.748583 2178.00 + -80.440150 43.750267 2171.00 + -80.440150 43.752033 2159.00 + -80.440217 43.753917 2149.00 + -80.440117 43.755850 2143.00 + -80.439900 43.757817 2131.00 + -80.439650 43.759833 2119.00 + -80.439483 43.761867 2116.00 + -80.439367 43.763800 2114.00 + -80.439350 43.765900 2105.00 + -80.439267 43.767783 2096.00 + -80.439100 43.769617 2092.00 + -80.438983 43.771417 2078.00 + -80.438883 43.773233 2063.00 + -80.438717 43.775067 2050.00 + -80.438533 43.776933 2039.00 + -80.438350 43.778783 2032.00 + -80.438133 43.780583 2022.00 + -80.437867 43.782433 2009.00 + -80.437667 43.784350 1996.00 + -80.437583 43.786317 1986.00 + -80.437483 43.788283 1986.00 + -80.437350 43.790150 1990.00 + -80.437183 43.791950 1982.00 + -80.437017 43.793750 1975.00 + -80.436817 43.795533 1970.00 + -80.436533 43.797350 1951.00 + -80.435583 43.799100 1948.00 + -80.434467 43.800683 1946.00 + -80.433400 43.802300 1940.00 + -80.432333 43.803950 1934.00 + -80.431200 43.805617 1934.00 + -80.430017 43.807233 1942.00 + -80.428983 43.808717 1953.00 + -80.428033 43.810167 1959.00 + -80.427150 43.811550 1968.00 + -80.426250 43.812900 1975.00 + -80.425233 43.814183 1983.00 + -80.424300 43.815550 1988.00 + -80.423450 43.817000 1984.00 + -80.422700 43.818500 1973.00 + -80.421950 43.820067 1967.00 + -80.421167 43.821667 1965.00 + -80.420417 43.823317 1963.00 + -80.419767 43.825017 1961.00 + -80.418883 43.826717 1952.00 + -80.417900 43.828383 1949.00 + -80.417000 43.830017 1945.00 + -80.416100 43.831617 1937.00 + -80.415233 43.833283 1930.00 + -80.414467 43.835017 1926.00 + -80.414550 43.836550 1954.00 + -80.415967 43.836833 1971.00 + -80.416833 43.836150 1983.00 + -80.416800 43.835167 1987.00 + -80.415950 43.834283 1990.00 + -80.414400 43.833917 1990.00 + -80.412667 43.834267 1991.00 + -80.411367 43.835167 1992.00 + -80.410733 43.836367 1990.00 + -80.410783 43.837583 1992.00 + -80.411483 43.838650 1992.00 + -80.412783 43.839367 1992.00 + -80.414433 43.839783 1987.00 + -80.416150 43.840133 2000.00 + -80.417733 43.840467 2009.00 + -80.419267 43.840283 2024.00 + -80.419700 43.839367 2035.00 + -80.418933 43.838533 2046.00 + -80.417517 43.838117 2056.00 + -80.415950 43.838217 2068.00 + -80.414600 43.838883 2072.00 + -80.414333 43.840017 2078.00 + -80.415367 43.840783 2084.00 + -80.416800 43.840517 2088.00 + -80.417183 43.839533 2103.00 + -80.416300 43.838717 2113.00 + -80.414833 43.838500 2123.00 + -80.413467 43.838967 2126.00 + -80.412833 43.840000 2122.00 + -80.413317 43.841067 2125.00 + -80.414550 43.841783 2134.00 + -80.416017 43.841867 2140.00 + -80.417183 43.841333 2147.00 + -80.417700 43.840383 2155.00 + -80.417550 43.839333 2166.00 + -80.417000 43.838400 2175.00 + -80.415767 43.837800 2174.00 + -80.414150 43.837833 2173.00 + -80.412750 43.838483 2177.00 + -80.412167 43.839567 2182.00 + -80.412483 43.840667 2179.00 + -80.413417 43.841567 2184.00 + -80.414600 43.842400 2184.00 + -80.415950 43.843150 2183.00 + -80.417483 43.844000 2192.00 + -80.418817 43.844833 2208.00 + -80.420317 43.845233 2212.00 + -80.420533 43.844383 2216.00 + -80.419033 43.844117 2220.00 + -80.417350 43.844500 2235.00 + -80.416183 43.845350 2256.00 + -80.416550 43.846433 2266.00 + -80.417950 43.846567 2271.00 + -80.418200 43.845750 2270.00 + -80.416733 43.845333 2286.00 + -80.415317 43.845733 2303.00 + -80.414767 43.846767 2309.00 + -80.415017 43.848000 2309.00 + -80.415400 43.849250 2312.00 + -80.415917 43.850467 2314.00 + -80.416417 43.851667 2311.00 + -80.416967 43.852933 2297.00 + -80.417667 43.854317 2291.00 + -80.418367 43.855717 2295.00 + -80.419183 43.857000 2297.00 + -80.419883 43.858267 2289.00 + -80.420600 43.859600 2284.00 + -80.421333 43.860967 2276.00 + -80.421983 43.862367 2269.00 + -80.422467 43.863733 2273.00 + -80.422983 43.865000 2265.00 + -80.423650 43.866317 2249.00 + -80.424283 43.867767 2234.00 + -80.424950 43.869250 2228.00 + -80.425617 43.870733 2223.00 + -80.426183 43.872350 2216.00 + -80.426633 43.873817 2216.00 + -80.427167 43.875233 2210.00 + -80.427683 43.876683 2207.00 + -80.428050 43.878067 2208.00 + -80.428467 43.879417 2201.00 + -80.428933 43.880800 2192.00 + -80.429400 43.882233 2188.00 + -80.429883 43.883633 2186.00 + -80.430400 43.885017 2179.00 + -80.430900 43.886417 2176.00 + -80.431433 43.887800 2171.00 + -80.432117 43.889183 2161.00 + -80.432817 43.890633 2156.00 + -80.433500 43.892083 2155.00 + -80.434017 43.893567 2159.00 + -80.434433 43.895050 2153.00 + -80.434867 43.896517 2148.00 + -80.435383 43.897967 2138.00 + -80.435917 43.899450 2126.00 + -80.436367 43.900967 2120.00 + -80.436633 43.902383 2144.00 + -80.436700 43.903517 2162.00 + -80.436883 43.904767 2160.00 + -80.437083 43.906000 2168.00 + -80.437267 43.907083 2168.00 + -80.437550 43.908483 2167.00 + -80.437767 43.909767 2164.00 + -80.438000 43.911100 2148.00 + -80.438300 43.912567 2134.00 + -80.438567 43.914083 2125.00 + -80.438867 43.915617 2116.00 + -80.439233 43.917167 2107.00 + -80.439500 43.918733 2096.00 + -80.439800 43.920300 2092.00 + -80.440050 43.921750 2094.00 + -80.440233 43.923150 2089.00 + -80.440367 43.924550 2078.00 + -80.440500 43.926033 2067.00 + -80.440733 43.927533 2057.00 + -80.441083 43.929067 2045.00 + -80.441250 43.930633 2044.00 + -80.440950 43.932067 2055.00 + -80.440467 43.933383 2062.00 + -80.439800 43.934633 2066.00 + -80.439833 43.935900 2082.00 + -80.440867 43.936750 2095.00 + -80.441933 43.936400 2106.00 + -80.441417 43.935550 2111.00 + -80.439950 43.935333 2126.00 + -80.438650 43.935967 2138.00 + -80.438267 43.937133 2143.00 + -80.439083 43.938083 2148.00 + -80.440433 43.938050 2155.00 + -80.441050 43.937250 2162.00 + -80.440567 43.936333 2171.00 + -80.439300 43.935817 2181.00 + -80.437800 43.935650 2187.00 + -80.436283 43.936100 2186.00 + -80.435650 43.937250 2194.00 + -80.435917 43.938383 2199.00 + -80.437033 43.939000 2205.00 + -80.438350 43.939050 2209.00 + -80.439300 43.938517 2217.00 + -80.439433 43.937667 2219.00 + -80.438433 43.936900 2221.00 + -80.436917 43.936967 2235.00 + -80.435867 43.937783 2233.00 + -80.435567 43.939033 2227.00 + -80.435600 43.940333 2229.00 + -80.435900 43.941600 2227.00 + -80.436367 43.942883 2224.00 + -80.436917 43.944183 2224.00 + -80.437550 43.945450 2222.00 + -80.438183 43.946750 2218.00 + -80.438850 43.948033 2216.00 + -80.439650 43.949283 2220.00 + -80.440567 43.950633 2226.00 + -80.441450 43.951867 2226.00 + -80.442367 43.953133 2223.00 + -80.443217 43.954417 2219.00 + -80.443933 43.955667 2212.00 + -80.444650 43.956933 2201.00 + -80.445417 43.958217 2198.00 + -80.446150 43.959533 2189.00 + -80.446917 43.960833 2188.00 + -80.447400 43.962133 2188.00 + -80.447767 43.963417 2174.00 + -80.448250 43.964783 2160.00 + -80.448750 43.966200 2156.00 + -80.449233 43.967533 2158.00 + -80.449750 43.968817 2157.00 + -80.450267 43.970033 2149.00 + -80.450833 43.971333 2132.00 + -80.451617 43.972683 2123.00 + -80.452317 43.974100 2119.00 + -80.453133 43.975500 2111.00 + -80.453967 43.976867 2112.00 + -80.454783 43.978217 2112.00 + -80.455600 43.979500 2113.00 + -80.456467 43.980683 2111.00 + -80.457317 43.981900 2099.00 + -80.458150 43.983133 2095.00 + -80.458950 43.984350 2090.00 + -80.459767 43.985583 2079.00 + -80.460617 43.986867 2066.00 + -80.461417 43.988150 2059.00 + -80.462217 43.989317 2057.00 + -80.463150 43.990433 2045.00 + -80.464183 43.991567 2040.00 + -80.465217 43.992717 2037.00 + -80.466183 43.993883 2032.00 + -80.467200 43.995050 2018.00 + -80.468267 43.996267 2000.00 + -80.469367 43.997617 1985.00 + -80.470500 43.999000 1969.00 + -80.471600 44.000433 1957.00 + -80.472633 44.001883 1947.00 + -80.473717 44.003317 1937.00 + -80.474700 44.004767 1931.00 + -80.475683 44.006233 1921.00 + -80.476600 44.007700 1912.00 + -80.477517 44.009133 1903.00 + -80.478483 44.010517 1907.00 + -80.479333 44.011733 1917.00 + -80.480283 44.012867 1916.00 + -80.481350 44.014033 1921.00 + -80.482483 44.015183 1930.00 + -80.483600 44.016367 1941.00 + -80.483317 44.017867 1957.00 + -80.481683 44.018667 1966.00 + -80.480350 44.018050 1976.00 + -80.481067 44.017133 1982.00 + -80.482917 44.017283 1997.00 + -80.484033 44.018467 2020.00 + -80.483567 44.019867 2032.00 + -80.482067 44.020433 2042.00 + -80.481000 44.019783 2052.00 + -80.481600 44.018800 2058.00 + -80.483317 44.018867 2075.00 + -80.483833 44.020167 2096.00 + -80.482533 44.021067 2102.00 + -80.481183 44.020733 2107.00 + -80.481417 44.019850 2120.00 + -80.482783 44.019450 2129.00 + -80.484267 44.020300 2133.00 + -80.484067 44.021917 2130.00 + -80.482267 44.022700 2137.00 + -80.480933 44.022317 2161.00 + -80.480133 44.021600 2171.00 + -80.479417 44.020783 2183.00 + -80.479017 44.019917 2186.00 + -80.479917 44.019183 2183.00 + -80.481550 44.019483 2190.00 + -80.482700 44.020600 2199.00 + -80.483233 44.021967 2206.00 + -80.482517 44.023283 2212.00 + -80.480950 44.023783 2216.00 + -80.480100 44.023200 2230.00 + -80.481017 44.022600 2230.00 + -80.482667 44.022750 2235.00 + -80.484150 44.023533 2244.00 + -80.485333 44.024600 2245.00 + -80.486433 44.025783 2240.00 + -80.487517 44.026917 2234.00 + -80.488650 44.027950 2232.00 + -80.489733 44.029000 2224.00 + -80.490867 44.030117 2211.00 + -80.490700 44.031483 2204.00 + -80.489133 44.031717 2193.00 + -80.488350 44.030783 2184.00 + -80.487733 44.029650 2167.00 + -80.487133 44.028383 2153.00 + -80.486533 44.026967 2130.00 + -80.485917 44.025367 2110.00 + -80.485350 44.023717 2117.00 + -80.484900 44.022083 2119.00 + -80.484417 44.020517 2120.00 + -80.483933 44.018950 2119.00 + -80.483433 44.017433 2126.00 + -80.482917 44.015867 2127.00 + -80.482483 44.014250 2121.00 + -80.482000 44.012600 2110.00 + -80.481433 44.010950 2100.00 + -80.480783 44.009300 2091.00 + -80.480117 44.007650 2081.00 + -80.479450 44.005950 2067.00 + -80.478833 44.004217 2056.00 + -80.478217 44.002467 2046.00 + -80.477567 44.000683 2037.00 + -80.476900 43.998933 2035.00 + -80.476217 43.997183 2023.00 + -80.475617 43.995433 2017.00 + -80.475100 43.993717 2010.00 + -80.474567 43.992017 2000.00 + -80.473983 43.990317 1988.00 + -80.473483 43.988600 1980.00 + -80.473067 43.986883 1967.00 + -80.472633 43.985133 1953.00 + -80.472217 43.983417 1944.00 + -80.471883 43.981717 1932.00 + -80.471550 43.980033 1914.00 + -80.471183 43.978350 1899.00 + -80.470867 43.976633 1878.00 + -80.470417 43.974950 1869.00 + -80.469833 43.973117 1862.00 + -80.469183 43.971483 1859.00 + -80.468600 43.969833 1858.00 + -80.468067 43.968183 1853.00 + -80.467483 43.966483 1841.00 + -80.466867 43.964767 1831.00 + -80.466267 43.963100 1818.00 + -80.465717 43.961433 1804.00 + -80.465183 43.959783 1784.00 + -80.464617 43.958100 1767.00 + -80.464133 43.956400 1754.00 + -80.463783 43.954700 1744.00 + -80.463417 43.952983 1729.00 + -80.463033 43.951233 1722.00 + -80.462667 43.949483 1719.00 + -80.462250 43.947767 1713.00 + -80.461850 43.945983 1712.00 + -80.461467 43.944217 1720.00 + -80.461133 43.942483 1726.00 + -80.460783 43.940750 1721.00 + -80.460483 43.939017 1712.00 + -80.460200 43.937283 1708.00 + -80.459933 43.935550 1699.00 + -80.459633 43.933767 1684.00 + -80.459317 43.931950 1676.00 + -80.458950 43.930117 1668.00 + -80.458567 43.928283 1660.00 + -80.458133 43.926467 1666.00 + -80.457683 43.924733 1659.00 + -80.457267 43.923017 1652.00 + -80.456917 43.921317 1642.00 + -80.456533 43.919633 1628.00 + -80.456183 43.917933 1615.00 + -80.455817 43.916267 1596.00 + -80.455400 43.914567 1585.00 + -80.455067 43.912900 1571.00 + -80.454900 43.911283 1560.00 + -80.454733 43.909650 1538.00 + -80.454517 43.908017 1525.00 + -80.454383 43.906383 1521.00 + -80.454233 43.904767 1503.00 + -80.454033 43.902933 1479.00 + -80.453783 43.900950 1453.00 + -80.453517 43.898933 1441.00 + -80.453217 43.896983 1427.00 + -80.452867 43.895083 1418.00 + -80.452533 43.893200 1401.00 + -80.452217 43.891300 1387.00 + -80.451983 43.889383 1377.00 + -80.451767 43.887483 1367.00 + -80.451567 43.885533 1367.00 + -80.451367 43.883650 1371.00 + -80.451150 43.881833 1369.00 + -80.450833 43.880033 1362.00 + -80.450400 43.878250 1348.00 + -80.449850 43.876450 1336.00 + -80.449300 43.874617 1319.00 + -80.448950 43.872667 1305.00 + -80.448750 43.870633 1299.00 + -80.448717 43.868600 1295.00 + -80.448750 43.866567 1293.00 + -80.448800 43.864583 1290.00 + -80.448883 43.862600 1279.00 + -80.449067 43.860683 1276.00 + -80.449450 43.858883 1271.00 + -80.450083 43.857167 1263.00 + -80.450900 43.855517 1257.00 + -80.451850 43.853967 1251.00 + -80.452817 43.852467 1244.00 + -80.453533 43.850983 1239.00 + -80.454167 43.849367 1236.00 + -80.454617 43.847900 1225.00 + -80.455050 43.846350 1213.00 + -80.455317 43.844733 1201.00 + -80.455333 43.843067 1195.00 + -80.455217 43.841450 1200.00 + -80.455067 43.839950 1202.00 + -80.454850 43.838517 1207.00 + -80.454583 43.837267 1210.00 + -80.454167 43.836083 1196.00 + -80.453483 43.834967 1189.00 + -80.452700 43.833900 1177.00 + -80.451717 43.832800 1164.00 + -80.450633 43.831667 1155.00 + -80.449400 43.830550 1137.00 + -80.448217 43.829417 1118.00 + -80.447017 43.828350 1103.00 + -80.445867 43.827350 1096.00 + -80.444683 43.826433 1073.00 + -80.443350 43.825600 1048.00 + -80.441833 43.824883 1022.00 + -80.440083 43.824383 1000.00 + -80.438200 43.824050 980.00 + -80.436283 43.823900 962.00 + -80.434350 43.824083 947.00 + -80.432483 43.824517 932.00 + -80.430700 43.825133 913.00 + -80.428983 43.825817 891.00 + -80.427300 43.826550 873.00 + -80.425733 43.827333 857.00 + -80.424217 43.828167 840.00 + -80.422750 43.829083 823.00 + -80.421333 43.830050 801.00 + -80.420200 43.831217 784.00 + -80.419800 43.832567 773.00 + -80.420200 43.833850 761.00 + -80.421250 43.834967 750.00 + -80.422550 43.835967 737.00 + -80.423917 43.836917 729.00 + -80.425367 43.837883 717.00 + -80.426800 43.838917 699.00 + -80.428100 43.840067 684.00 + -80.429167 43.841300 671.00 + -80.430033 43.842617 664.00 + -80.430733 43.844033 658.00 + -80.431250 43.845567 657.00 + -80.431583 43.847067 651.00 + -80.431950 43.848550 642.00 + -80.432533 43.849917 634.00 + -80.433750 43.850917 626.00 + -80.435317 43.851267 618.00 + -80.436950 43.851283 604.00 + -80.438617 43.851017 588.00 + -80.440267 43.850617 571.00 + -80.441800 43.850050 556.00 + -80.443267 43.849383 538.00 + -80.444617 43.848583 521.00 + -80.445483 43.847517 507.00 + -80.445250 43.846283 497.00 + -80.444717 43.845050 483.00 + -80.444150 43.843833 474.00 + -80.443633 43.842650 468.00 + -80.443167 43.841567 467.00 + -80.442850 43.840800 468.00 + -80.442750 43.840550 468.00 + -80.442750 43.840550 469.00 + -80.442750 43.840550 469.00 + -80.442750 43.840550 469.00 + -80.442750 43.840550 469.00 + -80.442750 43.840550 469.00 + -80.442750 43.840567 468.00 + -80.442750 43.840567 468.00 + -80.442750 43.840567 468.00 + -80.442750 43.840567 467.00 + -80.442750 43.840567 467.00 + -80.442750 43.840567 467.00 + -80.442750 43.840567 467.00 + -80.442750 43.840567 466.00 + -80.442750 43.840567 466.00 + -80.442750 43.840567 466.00 + -80.442750 43.840567 466.00 + -80.442750 43.840567 466.00 + -80.442750 43.840567 465.00 + -80.442750 43.840567 465.00 + -80.442750 43.840567 465.00 + -80.442750 43.840567 465.00 + -80.442750 43.840567 466.00 + -80.442750 43.840567 467.00 + -80.442750 43.840567 468.00 + -80.442750 43.840567 469.00 + -80.442750 43.840567 469.00 + -80.442750 43.840567 470.00 + -80.442750 43.840550 471.00 + -80.442750 43.840550 471.00 + -80.442750 43.840550 472.00 + -80.442750 43.840550 472.00 + -80.442750 43.840550 472.00 + -80.442750 43.840550 473.00 + -80.442750 43.840550 473.00 + -80.442750 43.840550 473.00 + -80.442750 43.840550 474.00 + -80.442750 43.840550 474.00 + -80.442750 43.840550 474.00 + -80.442750 43.840550 473.00 + -80.442750 43.840550 473.00 + -80.442750 43.840550 473.00 + -80.442750 43.840550 473.00 + -80.442733 43.840533 473.00 + -80.442700 43.840483 473.00 + -80.442650 43.840433 473.00 + -80.442583 43.840383 473.00 + -80.442517 43.840317 473.00 + -80.442450 43.840267 473.00 + -80.442383 43.840200 473.00 + -80.442300 43.840150 473.00 + -80.442233 43.840117 473.00 + -80.442200 43.840067 473.00 + -80.442167 43.840017 473.00 + -80.442117 43.839983 473.00 + -80.442067 43.839933 473.00 + -80.442033 43.839900 474.00 + -80.441983 43.839850 473.00 + -80.441933 43.839817 473.00 + -80.441883 43.839767 473.00 + -80.441833 43.839733 473.00 + -80.441767 43.839683 473.00 + -80.441717 43.839650 473.00 + -80.441650 43.839617 473.00 + -80.441600 43.839567 474.00 + -80.441533 43.839533 474.00 + -80.441500 43.839483 474.00 + -80.441433 43.839450 474.00 + -80.441350 43.839400 473.00 + -80.441317 43.839367 473.00 + -80.441250 43.839317 473.00 + -80.441200 43.839283 473.00 + -80.441150 43.839250 473.00 + -80.441100 43.839200 473.00 + -80.441067 43.839167 473.00 + -80.441017 43.839133 473.00 + -80.440967 43.839083 473.00 + -80.440933 43.839050 473.00 + -80.440883 43.839017 473.00 + -80.440817 43.838983 473.00 + -80.440767 43.838933 473.00 + -80.440700 43.838900 473.00 + -80.440667 43.838867 473.00 + -80.440617 43.838817 473.00 + -80.440533 43.838767 473.00 + -80.440483 43.838733 473.00 + -80.440433 43.838700 472.00 + -80.440383 43.838650 473.00 + -80.440333 43.838600 473.00 + -80.440267 43.838567 473.00 + -80.440233 43.838533 473.00 + -80.440183 43.838483 474.00 + -80.440117 43.838450 474.00 + -80.440083 43.838417 473.00 + -80.440033 43.838383 474.00 + -80.439983 43.838350 474.00 + -80.439950 43.838300 474.00 + -80.439883 43.838267 474.00 + -80.439850 43.838233 474.00 + -80.439800 43.838183 475.00 + -80.439750 43.838150 475.00 + -80.439717 43.838117 475.00 + -80.439683 43.838083 476.00 + -80.439617 43.838050 476.00 + -80.439567 43.838000 476.00 + -80.439517 43.837967 477.00 + -80.439483 43.837933 477.00 + -80.439433 43.837900 477.00 + -80.439367 43.837867 478.00 + -80.439317 43.837817 478.00 + -80.439250 43.837783 478.00 + -80.439200 43.837733 478.00 + -80.439150 43.837700 478.00 + -80.439100 43.837667 478.00 + -80.439050 43.837633 478.00 + -80.439000 43.837600 478.00 + -80.438950 43.837550 478.00 + -80.438900 43.837517 478.00 + -80.438833 43.837483 478.00 + -80.438783 43.837450 478.00 + + + + 0 + 0 + 0 + 0.46 + 0.76 + 0.96 + 1.12 + 1.11 + 1.08 + 1.01 + 1.03 + 1.01 + 0.97 + 1 + 0.97 + 0.95 + 0.99 + 1.03 + 1.02 + 1.03 + 1.03 + 1.01 + 1.07 + 1.12 + 1.22 + 1.31 + 1.26 + 1.28 + 1.22 + 1.19 + 1.21 + 1.15 + 1.12 + 1.08 + 1.03 + 1.03 + 1.04 + 0.98 + 0.97 + 0.95 + 0.97 + 1.02 + 0.99 + 1 + 1 + 1.02 + 1.12 + 1.17 + 1.27 + 1.29 + 1.36 + 1.4 + 1.38 + 1.36 + 1.33 + 1.28 + 1.21 + 1.17 + 1.18 + 1.15 + 1.1 + 1.09 + 1.14 + 1.19 + 1.18 + 1.19 + 1.16 + 1.13 + 1.15 + 1.1 + 1.09 + 1.14 + 1.21 + 1.31 + 1.26 + 1.08 + 0.97 + 0.95 + 0.93 + 0.88 + 0.82 + 0.83 + 0.87 + 0.88 + 0.9 + 0.88 + 0.89 + 0.91 + 0.79 + 0.82 + 0.88 + 0.87 + 0.85 + 0.81 + 0.82 + 0.77 + 0.81 + 0.84 + 0.87 + 0.85 + 0.74 + 0.79 + 0.81 + 0.83 + 0.88 + 0.89 + 0.83 + 0.86 + 0.78 + 0.79 + 0.88 + 0.91 + 0.91 + 0.9 + 0.84 + 0.8 + 0.97 + 0.98 + 0.97 + 0.92 + 0.85 + 0.87 + 0.94 + 0.97 + 0.93 + 0.87 + 0.85 + 0.8 + 0.92 + 0.9 + 0.86 + 0.84 + 0.81 + 0.76 + 0.88 + 0.91 + 0.89 + 0.85 + 0.9 + 0.89 + 0.89 + 0.95 + 0.93 + 0.91 + 0.85 + 0.83 + 0.83 + 0.77 + 0.83 + 0.88 + 0.93 + 0.9 + 0.89 + 0.79 + 0.75 + 0.75 + 0.93 + 0.83 + 0.96 + 0.89 + 0.79 + 0.81 + 0.87 + 0.95 + 0.96 + 0.88 + 0.77 + 0.84 + 0.86 + 0.96 + 0.94 + 0.85 + 0.78 + 0.87 + 0.85 + 0.93 + 0.9 + 0.88 + 0.85 + 0.84 + 0.86 + 0.85 + 0.93 + 1 + 0.94 + 0.9 + 0.87 + 0.85 + 0.86 + 0.99 + 1.03 + 1.11 + 1.2 + 1.26 + 1.2 + 0.82 + 0.8 + 1.04 + 1.17 + 1.2 + 1.24 + 1.26 + 1.28 + 1.3 + 1.3 + 0.87 + 0.97 + 0.99 + 1.13 + 1.23 + 1.27 + 1.3 + 1.35 + 1.39 + 1.38 + 1.35 + 1.14 + 1.15 + 1.34 + 1.36 + 1.29 + 1.22 + 1.17 + 1.16 + 1.14 + 1.16 + 1.15 + 1.17 + 1.07 + 0.9 + 0.86 + 0.99 + 1.1 + 1.15 + 1.19 + 1.24 + 1.24 + 1.17 + 1.16 + 1.19 + 1.24 + 1.29 + 1.32 + 1.32 + 1.24 + 1.22 + 1.19 + 1.19 + 1.24 + 1.29 + 1.35 + 1.39 + 1.39 + 1.36 + 1.34 + 1.32 + 1.31 + 1.37 + 1.39 + 1.41 + 1.38 + 1.38 + 1.36 + 1.38 + 1.41 + 1.41 + 1.43 + 1.48 + 1.48 + 1.4 + 1.33 + 1.34 + 1.39 + 1.42 + 1.4 + 1.32 + 1.27 + 1.28 + 1.34 + 1.41 + 1.41 + 1.38 + 1.3 + 1.12 + 1 + 0.96 + 0.92 + 0.96 + 0.95 + 0.97 + 0.95 + 0.96 + 1.01 + 1.07 + 1.08 + 1.03 + 1 + 0.98 + 1.01 + 1.05 + 1.04 + 1.02 + 0.98 + 0.99 + 0.97 + 0.99 + 1.05 + 0.94 + 0.83 + 0.75 + 0.7 + 0.78 + 0.84 + 0.86 + 0.96 + 0.94 + 0.99 + 0.94 + 0.91 + 0.84 + 0.93 + 0.95 + 1.01 + 0.9 + 0.85 + 0.98 + 0.96 + 0.99 + 0.95 + 0.81 + 0.77 + 0.81 + 1.06 + 1 + 0.82 + 0.79 + 0.88 + 0.96 + 0.97 + 0.98 + 0.91 + 0.77 + 0.87 + 0.89 + 0.92 + 1.04 + 0.9 + 0.88 + 0.83 + 0.88 + 0.93 + 0.98 + 0.94 + 0.78 + 0.79 + 0.79 + 0.88 + 0.95 + 0.87 + 0.96 + 0.89 + 0.89 + 0.87 + 0.83 + 0.9 + 0.9 + 0.96 + 0.99 + 0.96 + 0.97 + 0.89 + 0.84 + 0.84 + 0.89 + 0.95 + 0.95 + 1.04 + 0.88 + 0.86 + 0.88 + 0.81 + 0.82 + 0.88 + 0.86 + 0.93 + 1.04 + 1.11 + 0.99 + 0.91 + 1.07 + 1.19 + 1.16 + 0.94 + 0.84 + 0.86 + 0.86 + 0.86 + 0.94 + 1 + 0.98 + 0.95 + 0.92 + 0.96 + 0.98 + 1.01 + 1.08 + 1.08 + 1.05 + 1.08 + 1.12 + 1.18 + 1.25 + 1.22 + 1.25 + 1.25 + 1.18 + 1.12 + 1.06 + 1.03 + 0.92 + 0.89 + 0.93 + 0.98 + 1.03 + 1.14 + 0.93 + 0.91 + 1.08 + 1.07 + 1.04 + 0.92 + 1.01 + 1.11 + 0.95 + 0.89 + 0.85 + 0.87 + 0.86 + 0.9 + 0.9 + 0.83 + 0.86 + 0.9 + 0.88 + 0.86 + 0.91 + 0.95 + 0.88 + 0.88 + 0.92 + 0.99 + 0.97 + 1.02 + 1.1 + 1.02 + 0.95 + 1.07 + 1.24 + 1.29 + 1.34 + 1.47 + 1.61 + 1.74 + 1.86 + 1.79 + 1.76 + 1.71 + 1.61 + 1.51 + 1.46 + 1.47 + 1.46 + 1.45 + 1.4 + 1.36 + 1.4 + 1.46 + 1.52 + 1.54 + 1.49 + 1.39 + 1.42 + 1.44 + 1.42 + 1.37 + 1.34 + 1.37 + 1.46 + 1.53 + 1.56 + 1.59 + 1.64 + 1.58 + 1.52 + 1.51 + 1.5 + 1.44 + 1.43 + 1.46 + 1.49 + 1.48 + 1.47 + 1.45 + 1.5 + 1.56 + 1.58 + 1.54 + 1.44 + 1.44 + 1.44 + 1.42 + 1.51 + 1.44 + 1.41 + 1.43 + 1.48 + 1.48 + 1.4 + 1.3 + 1.25 + 1.2 + 1.18 + 1.19 + 1.23 + 1.27 + 1.29 + 1.34 + 1.38 + 1.39 + 1.41 + 1.47 + 1.43 + 1.38 + 1.39 + 1.43 + 1.45 + 1.06 + 0.82 + 0.74 + 0.84 + 0.89 + 1.01 + 1.06 + 1.04 + 1.02 + 0.95 + 0.94 + 0.94 + 1.05 + 0.99 + 0.94 + 0.87 + 0.79 + 0.84 + 0.9 + 0.93 + 0.97 + 0.9 + 0.89 + 0.87 + 0.83 + 0.86 + 0.88 + 0.9 + 0.9 + 0.93 + 0.9 + 0.82 + 0.79 + 0.84 + 0.83 + 0.82 + 0.92 + 0.96 + 0.95 + 0.91 + 0.89 + 0.93 + 0.97 + 0.98 + 1.02 + 1.01 + 0.89 + 0.79 + 1.01 + 1.01 + 0.95 + 0.94 + 0.75 + 0.85 + 0.93 + 0.89 + 0.94 + 1.02 + 1.02 + 0.99 + 1 + 1.13 + 1.21 + 1.16 + 1.09 + 1.12 + 1.15 + 1.18 + 1.17 + 1.06 + 1.08 + 1.16 + 1.24 + 1.24 + 1.23 + 1.23 + 1.16 + 1.19 + 1.17 + 1.09 + 1.12 + 1.16 + 1.16 + 1.15 + 1.16 + 1.15 + 1.14 + 1.2 + 1.23 + 1.23 + 1.21 + 1.22 + 1.18 + 1.21 + 1.23 + 1.22 + 1.05 + 0.9 + 1.03 + 0.96 + 1.01 + 1.04 + 1.01 + 1.13 + 1.21 + 1.23 + 1.25 + 1.26 + 1.26 + 1.24 + 1.12 + 1.11 + 1.14 + 1.2 + 1.22 + 1.25 + 1.23 + 1.11 + 1.07 + 1.05 + 0.99 + 0.86 + 0.71 + 0.86 + 0.91 + 0.94 + 0.97 + 0.88 + 0.78 + 0.77 + 0.82 + 0.86 + 0.89 + 1.02 + 0.98 + 0.88 + 0.8 + 0.75 + 0.66 + 0.76 + 0.92 + 0.88 + 0.96 + 1.05 + 1.02 + 1.03 + 1.08 + 1.06 + 1.1 + 1.09 + 1.1 + 1.09 + 1.09 + 1.12 + 1.14 + 1.12 + 1.08 + 1.1 + 1.11 + 1.14 + 1.12 + 1.01 + 1.08 + 1.16 + 1.16 + 1.08 + 1.02 + 1.03 + 1.13 + 1.19 + 1.2 + 1.21 + 1.19 + 1.15 + 1.09 + 1.06 + 1.09 + 1.09 + 1.08 + 1.11 + 1.13 + 1.1 + 1 + 1.07 + 1.09 + 1.08 + 1.08 + 1.11 + 1.2 + 1.27 + 1.3 + 1.31 + 1.3 + 1.29 + 1.3 + 1.3 + 1.27 + 1.26 + 1.16 + 1.05 + 1.08 + 1.12 + 1.12 + 1.21 + 1.24 + 1.11 + 0.89 + 1 + 1.13 + 1.19 + 1.11 + 0.9 + 0.79 + 0.95 + 1.11 + 1.15 + 0.98 + 0.78 + 0.78 + 0.97 + 1.27 + 1.36 + 1.06 + 0.73 + 0.76 + 0.74 + 0.77 + 0.91 + 1.06 + 1.12 + 1.14 + 1.13 + 0.91 + 0.65 + 0.89 + 1.04 + 1.07 + 1.12 + 1.11 + 1.08 + 1.03 + 1.05 + 1.16 + 1.13 + 0.9 + 0.9 + 1.01 + 1.11 + 1.24 + 1.36 + 1.34 + 1.31 + 1.28 + 1.26 + 1.25 + 1.3 + 1.32 + 1.35 + 1.36 + 1.37 + 1.37 + 1.42 + 1.44 + 1.45 + 1.47 + 1.44 + 1.45 + 1.42 + 1.39 + 1.39 + 1.4 + 1.39 + 1.4 + 1.42 + 1.38 + 1.36 + 1.36 + 1.37 + 1.38 + 1.36 + 1.36 + 1.36 + 1.35 + 1.36 + 1.42 + 1.39 + 1.36 + 1.36 + 1.37 + 1.38 + 1.38 + 1.37 + 1.4 + 1.41 + 1.4 + 1.41 + 1.43 + 1.41 + 1.39 + 1.4 + 1.4 + 1.39 + 1.4 + 1.45 + 1.47 + 1.48 + 1.49 + 1.44 + 1.41 + 1.37 + 1.36 + 1.37 + 1.35 + 1.37 + 1.37 + 1.32 + 1.29 + 1.31 + 1.31 + 1.29 + 1.35 + 1.53 + 1.63 + 1.59 + 1.55 + 1.51 + 1.51 + 1.54 + 1.52 + 1.54 + 1.53 + 1.49 + 1.45 + 1.44 + 1.46 + 1.47 + 1.54 + 1.6 + 1.63 + 1.63 + 1.6 + 1.58 + 1.57 + 1.48 + 1.44 + 1.41 + 1.37 + 1.34 + 1.28 + 1.23 + 1.2 + 1.22 + 1.27 + 1.32 + 1.33 + 1.24 + 1.18 + 1.1 + 0.97 + 0.98 + 0.93 + 1.01 + 1.07 + 1.1 + 1.18 + 1.11 + 1.09 + 1 + 1.01 + 1.03 + 1.07 + 1.09 + 1.11 + 1.12 + 1.12 + 1.13 + 1.15 + 1.14 + 1.1 + 1.1 + 1.11 + 1.11 + 1.13 + 1.15 + 1.08 + 1.07 + 1.07 + 1.09 + 1.11 + 1.15 + 1.18 + 1.17 + 1.16 + 1.16 + 1.23 + 1.25 + 1.2 + 1.18 + 1.12 + 1.02 + 0.94 + 0.95 + 1 + 1 + 0.99 + 0.99 + 1.01 + 0.98 + 1.01 + 1.03 + 1.01 + 0.95 + 0.85 + 0.38 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0.01 + 0.06 + 0.06 + 0.05 + 0.06 + 0.05 + 0.07 + 0.06 + 0.02 + 0.04 + 0.04 + 0.03 + 0.04 + 0.04 + 0.04 + 0.04 + 0.04 + 0.04 + 0.05 + 0.05 + 0.04 + 0.05 + 0.02 + 0.02 + 0.03 + 0.05 + 0.05 + 0.04 + 0.02 + 0.04 + 0.03 + 0.04 + 0.04 + 0.03 + 0.04 + 0.04 + 0.04 + 0.04 + 0.04 + 0.05 + 0.05 + 0.04 + 0.03 + 0.03 + 0.05 + 0.05 + 0.04 + 0.04 + 0.04 + 0.04 + 0.02 + 0.02 + 0.04 + 0.02 + 0.03 + 0.03 + 0.04 + 0.04 + 0.03 + 0.03 + 0.05 + 0.04 + 0.04 + 0.04 + 0.03 + 0.03 + 0.04 + 0.05 + 0.05 + 0.04 + 0.04 + 0.04 + 0.04 + 0.03 + 0.03 + 0.04 + 0.04 + + + 9 + 9 + 9 + 9 + 8 + 9 + 13 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 8 + 9 + 9 + 11 + 10 + 11 + 9 + 10 + 10 + 9 + 9 + 8 + 10 + 10 + 9 + 10 + 11 + 8 + 9 + 8 + 10 + 10 + 9 + 8 + 10 + 9 + 9 + 9 + 10 + 9 + 10 + 10 + 8 + 10 + 10 + 10 + 10 + 9 + 10 + 8 + 7 + 11 + 10 + 11 + 9 + 8 + 8 + 10 + 10 + 10 + 7 + 10 + 8 + 11 + 15 + 9 + 8 + 9 + 10 + 11 + 10 + 9 + 9 + 9 + 10 + 9 + 8 + 10 + 11 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 11 + 10 + 11 + 10 + 9 + 10 + 11 + 10 + 9 + 11 + 10 + 10 + 10 + 10 + 11 + 9 + 10 + 10 + 10 + 10 + 12 + 9 + 10 + 10 + 10 + 10 + 11 + 10 + 12 + 11 + 10 + 10 + 11 + 10 + 10 + 11 + 11 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 10 + 11 + 9 + 9 + 10 + 10 + 9 + 10 + 11 + 10 + 10 + 10 + 11 + 10 + 10 + 9 + 12 + 9 + 11 + 10 + 10 + 11 + 11 + 10 + 11 + 11 + 9 + 13 + 10 + 10 + 10 + 11 + 9 + 13 + 9 + 11 + 10 + 9 + 8 + 11 + 11 + 8 + 10 + 10 + 10 + 11 + 12 + 11 + 10 + 12 + 8 + 9 + 9 + 10 + 15 + 10 + 8 + 10 + 9 + 9 + 9 + 9 + 10 + 8 + 12 + 5 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 11 + 8 + 8 + 9 + 10 + 10 + 10 + 9 + 9 + 9 + 11 + 9 + 10 + 7 + 9 + 8 + 9 + 10 + 9 + 10 + 11 + 10 + 8 + 9 + 9 + 9 + 9 + 8 + 10 + 7 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 8 + 8 + 8 + 8 + 11 + 8 + 10 + 10 + 8 + 9 + 8 + 7 + 8 + 12 + 10 + 9 + 9 + 8 + 9 + 10 + 9 + 8 + 8 + 8 + 9 + 9 + 11 + 9 + 8 + 9 + 9 + 10 + 11 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 11 + 13 + 10 + 11 + 11 + 10 + 10 + 9 + 9 + 9 + 9 + 12 + 10 + 11 + 11 + 8 + 11 + 11 + 11 + 13 + 9 + 12 + 13 + 10 + 10 + 11 + 11 + 11 + 9 + 14 + 11 + 10 + 12 + 11 + 10 + 10 + 9 + 10 + 9 + 12 + 10 + 9 + 13 + 8 + 11 + 10 + 10 + 10 + 11 + 12 + 10 + 11 + 9 + 10 + 10 + 8 + 12 + 8 + 9 + 10 + 12 + 11 + 9 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 9 + 9 + 12 + 10 + 10 + 10 + 9 + 9 + 10 + 8 + 10 + 9 + 10 + 8 + 9 + 10 + 9 + 11 + 9 + 9 + 9 + 9 + 8 + 10 + 10 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 11 + 10 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 8 + 11 + 11 + 11 + 9 + 13 + 13 + 16 + 11 + 10 + 12 + 11 + 11 + 8 + 12 + 10 + 9 + 10 + 10 + 10 + 10 + 11 + 9 + 9 + 9 + 12 + 15 + 10 + 10 + 9 + 8 + 9 + 10 + 8 + 7 + 10 + 10 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 7 + 9 + 9 + 9 + 8 + 9 + 9 + 10 + 10 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 10 + 8 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 8 + 9 + 9 + 8 + 11 + 7 + 8 + 9 + 10 + 9 + 10 + 9 + 9 + 9 + 10 + 10 + 9 + 9 + 11 + 9 + 8 + 9 + 8 + 9 + 8 + 10 + 9 + 9 + 9 + 11 + 12 + 9 + 9 + 10 + 10 + 10 + 9 + 10 + 9 + 10 + 8 + 10 + 9 + 11 + 9 + 10 + 9 + 9 + 9 + 10 + 10 + 10 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 10 + 9 + 9 + 10 + 9 + 10 + 9 + 9 + 9 + 14 + 11 + 9 + 9 + 10 + 12 + 11 + 13 + 10 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 10 + 10 + 8 + 10 + 8 + 9 + 10 + 8 + 9 + 10 + 9 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 8 + 10 + 10 + 11 + 11 + 9 + 10 + 8 + 10 + 9 + 8 + 9 + 9 + 10 + 9 + 9 + 10 + 10 + 8 + 9 + 9 + 9 + 9 + 9 + 10 + 8 + 9 + 12 + 10 + 11 + 11 + 11 + 11 + 9 + 10 + 10 + 9 + 10 + 10 + 9 + 9 + 11 + 9 + 10 + 8 + 10 + 9 + 10 + 11 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 8 + 9 + 8 + 9 + 10 + 11 + 9 + 9 + 10 + 8 + 9 + 10 + 10 + 9 + 8 + 9 + 10 + 10 + 9 + 10 + 9 + 9 + 10 + 8 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 9 + 10 + 10 + 8 + 10 + 10 + 10 + 13 + 11 + 11 + 12 + 11 + 9 + 8 + 10 + 11 + 9 + 10 + 13 + 12 + 11 + 11 + 9 + 11 + 11 + 12 + 12 + 8 + 10 + 9 + 10 + 11 + 11 + 10 + 9 + 9 + 12 + 10 + 11 + 10 + 8 + 8 + 9 + 9 + 9 + 9 + 12 + 12 + 12 + 9 + 9 + 9 + 9 + 10 + 8 + 9 + 9 + 11 + 9 + 10 + 10 + 8 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 10 + 10 + 9 + 9 + 11 + 9 + 9 + 10 + 8 + 9 + 9 + 9 + 10 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 11 + 8 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 11 + 8 + 9 + 9 + 9 + 8 + 8 + 10 + 6 + 9 + 9 + 10 + 10 + 9 + 10 + 7 + 9 + 9 + 10 + 8 + 9 + 10 + 8 + 11 + 10 + 8 + 9 + 9 + 9 + 7 + 9 + 9 + 10 + 10 + 9 + 10 + 9 + 8 + 9 + 10 + 9 + 9 + 10 + 8 + 8 + 9 + 9 + 10 + 9 + 8 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 5 + 9 + 9 + 10 + 7 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 10 + 11 + 9 + 9 + 9 + 8 + 9 + 10 + 9 + 9 + 9 + 8 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 10 + 11 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 8 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 9 + 10 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 8 + 8 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 8 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + + + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 9 + 10 + 9 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 10 + 9 + 9 + 9 + 9 + 9 + 10 + 9 + 9 + 9 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 12 + 12 + 12 + 12 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 10 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 11 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 9 + 10 + 10 + 10 + 10 + 10 + + + + + + + PRESALTTRK + + + +Description IGCHDRS~HFFXA015~HFPLTPILOTINCHARGE:CHRIS RAZL~HFCM2CREW2: ~HFGTYGLIDERTYPE:LS 4~HFGIDGLIDERID:~HFDTM100GPSDATUM:WGS-1984~HFRFWFIRMWAREVERSION:1.60~HFRHWHARDWAREVERSION:1.00~HFFTYFRTYPE:LX Eos~HFGPS:uBLOX-LEA-6S,50ch,max50000m~HFPRSPRESSALTSENSOR:INTERSEMA,MS5607,max15000m~HFCIDCOMPETITIONID:~HFCCLCOMPETITIONCLASS:~ +Distance 90.4 mi +Min Alt 1437.008 ft +Max Alt 7585.302 ft +Min Speed 0.8 mph +Max Speed 113.8 mph +Avg Speed 60.4 mph +Start Time 2022-07-16T19:41:31Z +End Time 2022-07-16T21:11:20Z + +]]> + + + 2022-07-16T19:41:31Z + 2022-07-16T21:11:20Z + + + Path + #lineStyle + + 1 + absolute + +-80.443083,43.840333,438.00 +-80.443083,43.840333,438.00 +-80.443083,43.840333,438.00 +-80.442617,43.839933,438.00 +-80.441667,43.839200,439.00 +-80.440567,43.838433,439.00 +-80.439233,43.837517,442.00 +-80.437850,43.836533,460.00 +-80.436450,43.835600,476.00 +-80.435117,43.834700,498.00 +-80.433833,43.833833,515.00 +-80.432483,43.833000,527.00 +-80.431400,43.832050,543.00 +-80.430767,43.830933,551.00 +-80.430767,43.829700,558.00 +-80.431133,43.828533,569.00 +-80.431967,43.827483,572.00 +-80.433300,43.826650,587.00 +-80.434950,43.826117,598.00 +-80.436800,43.825667,613.00 +-80.438317,43.825250,630.00 +-80.440050,43.825017,645.00 +-80.441817,43.825250,653.00 +-80.443417,43.825967,658.00 +-80.444700,43.827117,664.00 +-80.445300,43.828633,674.00 +-80.445100,43.830217,693.00 +-80.444250,43.831683,701.00 +-80.442550,43.832883,707.00 +-80.440667,43.833500,716.00 +-80.438600,43.833683,723.00 +-80.436650,43.833267,731.00 +-80.435117,43.832383,738.00 +-80.434150,43.831200,747.00 +-80.433833,43.829900,760.00 +-80.434267,43.828650,770.00 +-80.435350,43.827617,784.00 +-80.436817,43.826950,810.00 +-80.438400,43.826483,822.00 +-80.439983,43.826083,832.00 +-80.441567,43.825700,842.00 +-80.443217,43.825317,850.00 +-80.444850,43.824883,870.00 +-80.446267,43.824200,887.00 +-80.447117,43.823100,905.00 +-80.447167,43.821850,922.00 +-80.446417,43.820617,924.00 +-80.444900,43.819717,929.00 +-80.442883,43.819250,938.00 +-80.440683,43.819350,953.00 +-80.438333,43.820033,962.00 +-80.436700,43.821067,973.00 +-80.434900,43.822217,992.00 +-80.432783,43.822983,1004.00 +-80.430450,43.823183,1014.00 +-80.428217,43.822950,1027.00 +-80.426083,43.822233,1042.00 +-80.424683,43.821150,1058.00 +-80.423833,43.819800,1067.00 +-80.423767,43.818350,1077.00 +-80.424400,43.817033,1096.00 +-80.425667,43.816033,1102.00 +-80.427400,43.815400,1110.00 +-80.429400,43.815200,1120.00 +-80.431450,43.815367,1136.00 +-80.433483,43.815633,1154.00 +-80.435483,43.815517,1174.00 +-80.437300,43.814950,1194.00 +-80.438550,43.813850,1217.00 +-80.438850,43.812467,1236.00 +-80.438283,43.811150,1262.00 +-80.437033,43.810083,1288.00 +-80.435283,43.809367,1316.00 +-80.432900,43.809350,1327.00 +-80.430750,43.809950,1342.00 +-80.429117,43.809300,1347.00 +-80.427983,43.808300,1348.00 +-80.427067,43.807283,1346.00 +-80.425767,43.806633,1341.00 +-80.424533,43.807233,1336.00 +-80.424433,43.808267,1333.00 +-80.425217,43.809133,1330.00 +-80.426517,43.809633,1328.00 +-80.428017,43.809800,1328.00 +-80.429567,43.809767,1320.00 +-80.431083,43.809567,1319.00 +-80.432583,43.809317,1325.00 +-80.434083,43.808967,1336.00 +-80.434733,43.808067,1349.00 +-80.433900,43.807333,1358.00 +-80.432517,43.807600,1373.00 +-80.431917,43.808567,1383.00 +-80.432533,43.809533,1390.00 +-80.433900,43.809750,1400.00 +-80.434967,43.809000,1408.00 +-80.434883,43.808033,1423.00 +-80.433683,43.807633,1437.00 +-80.432600,43.808233,1454.00 +-80.432683,43.809283,1459.00 +-80.433933,43.809817,1471.00 +-80.435117,43.809400,1485.00 +-80.435283,43.808483,1490.00 +-80.434300,43.807800,1503.00 +-80.432933,43.807950,1522.00 +-80.432150,43.808833,1535.00 +-80.432667,43.809950,1540.00 +-80.434017,43.810300,1555.00 +-80.435250,43.809933,1567.00 +-80.436217,43.809083,1582.00 +-80.435717,43.808200,1591.00 +-80.434367,43.808000,1597.00 +-80.433183,43.808700,1613.00 +-80.433233,43.809800,1632.00 +-80.434617,43.810167,1643.00 +-80.435617,43.809400,1656.00 +-80.435033,43.808533,1666.00 +-80.433600,43.808583,1670.00 +-80.432950,43.809700,1689.00 +-80.433483,43.810800,1703.00 +-80.435017,43.811067,1717.00 +-80.436033,43.810283,1729.00 +-80.435650,43.809317,1738.00 +-80.434000,43.809100,1744.00 +-80.432850,43.809933,1761.00 +-80.432517,43.811067,1777.00 +-80.433733,43.811683,1786.00 +-80.434950,43.811167,1797.00 +-80.434833,43.810183,1809.00 +-80.433483,43.809817,1815.00 +-80.432267,43.810533,1833.00 +-80.432500,43.811567,1848.00 +-80.433817,43.811933,1856.00 +-80.434867,43.811283,1869.00 +-80.434717,43.810367,1881.00 +-80.433517,43.809850,1892.00 +-80.432033,43.810100,1906.00 +-80.431267,43.811050,1910.00 +-80.431600,43.812083,1912.00 +-80.432783,43.812750,1912.00 +-80.434267,43.812533,1919.00 +-80.434917,43.811567,1931.00 +-80.434283,43.810550,1941.00 +-80.432750,43.810283,1961.00 +-80.431500,43.810967,1973.00 +-80.431317,43.812017,1980.00 +-80.432133,43.812850,1981.00 +-80.433450,43.813300,1989.00 +-80.434850,43.813383,2002.00 +-80.435733,43.812700,2004.00 +-80.435333,43.811700,2000.00 +-80.433933,43.811300,2007.00 +-80.432483,43.811700,2024.00 +-80.432167,43.812750,2029.00 +-80.433300,43.813467,2039.00 +-80.434483,43.813100,2049.00 +-80.434733,43.812217,2055.00 +-80.433833,43.811417,2056.00 +-80.432450,43.811633,2076.00 +-80.431950,43.812650,2075.00 +-80.432867,43.813567,2085.00 +-80.434233,43.813417,2100.00 +-80.434767,43.812550,2104.00 +-80.434017,43.811700,2113.00 +-80.432517,43.811800,2125.00 +-80.431917,43.812883,2131.00 +-80.432817,43.813767,2140.00 +-80.434117,43.813517,2152.00 +-80.434300,43.812600,2155.00 +-80.433133,43.812000,2172.00 +-80.431817,43.812517,2176.00 +-80.431600,43.813667,2184.00 +-80.432667,43.814417,2193.00 +-80.433900,43.814017,2200.00 +-80.434000,43.813067,2202.00 +-80.432650,43.812833,2214.00 +-80.431700,43.813650,2213.00 +-80.432317,43.814683,2213.00 +-80.433767,43.815017,2218.00 +-80.435250,43.814850,2216.00 +-80.436467,43.814283,2210.00 +-80.436550,43.813300,2206.00 +-80.435483,43.812550,2216.00 +-80.434117,43.812117,2213.00 +-80.432633,43.812583,2211.00 +-80.432300,43.813750,2220.00 +-80.433433,43.814467,2222.00 +-80.434767,43.814050,2225.00 +-80.434717,43.813033,2234.00 +-80.433383,43.812633,2236.00 +-80.432083,43.813150,2227.00 +-80.432117,43.814433,2226.00 +-80.432550,43.815750,2222.00 +-80.433067,43.817150,2219.00 +-80.433650,43.818650,2219.00 +-80.434467,43.820100,2231.00 +-80.435967,43.820100,2247.00 +-80.436100,43.819167,2243.00 +-80.435233,43.818217,2221.00 +-80.433733,43.817283,2213.00 +-80.432033,43.816450,2211.00 +-80.430167,43.815717,2208.00 +-80.428183,43.815050,2203.00 +-80.426133,43.814483,2197.00 +-80.424017,43.813967,2190.00 +-80.421867,43.813417,2193.00 +-80.420200,43.812900,2222.00 +-80.418750,43.812450,2214.00 +-80.417233,43.811883,2212.00 +-80.415567,43.811367,2201.00 +-80.413683,43.810767,2191.00 +-80.411750,43.810050,2182.00 +-80.409733,43.809367,2173.00 +-80.407667,43.808667,2162.00 +-80.405600,43.807817,2153.00 +-80.403567,43.806883,2148.00 +-80.401533,43.805983,2143.00 +-80.399700,43.805167,2155.00 +-80.397983,43.804483,2148.00 +-80.396000,43.803917,2126.00 +-80.393850,43.803217,2116.00 +-80.391833,43.802383,2112.00 +-80.390033,43.801517,2109.00 +-80.388400,43.800600,2107.00 +-80.386883,43.799633,2101.00 +-80.385317,43.798533,2096.00 +-80.383900,43.797517,2090.00 +-80.382517,43.796450,2089.00 +-80.381283,43.795317,2091.00 +-80.380267,43.794083,2106.00 +-80.379533,43.792983,2118.00 +-80.378967,43.791983,2118.00 +-80.378450,43.790883,2104.00 +-80.377833,43.789633,2092.00 +-80.377183,43.788300,2083.00 +-80.376517,43.786900,2076.00 +-80.375850,43.785467,2060.00 +-80.375217,43.783933,2050.00 +-80.374633,43.782500,2051.00 +-80.374117,43.781100,2044.00 +-80.373717,43.779650,2032.00 +-80.373333,43.778150,2018.00 +-80.373000,43.776583,2004.00 +-80.372633,43.774950,1992.00 +-80.372267,43.773317,1985.00 +-80.371933,43.771733,1985.00 +-80.371617,43.770217,1985.00 +-80.371150,43.768733,1982.00 +-80.370617,43.767300,1978.00 +-80.370033,43.765850,1966.00 +-80.369367,43.764333,1955.00 +-80.368717,43.762750,1942.00 +-80.368050,43.761083,1932.00 +-80.367367,43.759417,1921.00 +-80.366800,43.757733,1917.00 +-80.366283,43.756100,1909.00 +-80.365783,43.754467,1903.00 +-80.365367,43.752833,1895.00 +-80.364917,43.751200,1880.00 +-80.364450,43.749517,1875.00 +-80.363883,43.747783,1870.00 +-80.363350,43.746083,1873.00 +-80.362750,43.744417,1873.00 +-80.362200,43.742750,1873.00 +-80.361567,43.741083,1868.00 +-80.360983,43.739400,1853.00 +-80.360383,43.737667,1845.00 +-80.359733,43.735950,1839.00 +-80.359050,43.734200,1824.00 +-80.358317,43.732417,1815.00 +-80.357617,43.730483,1816.00 +-80.357033,43.728850,1818.00 +-80.356500,43.727217,1811.00 +-80.355983,43.725550,1801.00 +-80.355350,43.723833,1787.00 +-80.354700,43.722133,1773.00 +-80.354083,43.720483,1764.00 +-80.353583,43.718900,1757.00 +-80.353150,43.717333,1749.00 +-80.352650,43.715750,1736.00 +-80.352000,43.714067,1721.00 +-80.351183,43.712400,1717.00 +-80.350367,43.710750,1714.00 +-80.349417,43.709217,1716.00 +-80.348567,43.707833,1730.00 +-80.347850,43.706617,1737.00 +-80.346983,43.705567,1733.00 +-80.346517,43.704450,1729.00 +-80.347133,43.703383,1725.00 +-80.348217,43.702467,1733.00 +-80.349300,43.701550,1732.00 +-80.350450,43.700683,1726.00 +-80.351683,43.699867,1716.00 +-80.352967,43.699033,1704.00 +-80.354367,43.698200,1695.00 +-80.355867,43.697400,1686.00 +-80.357267,43.696533,1684.00 +-80.358633,43.695717,1676.00 +-80.359983,43.694967,1668.00 +-80.361317,43.694167,1660.00 +-80.362583,43.693250,1655.00 +-80.363833,43.692283,1654.00 +-80.365100,43.691367,1659.00 +-80.366250,43.690450,1666.00 +-80.367400,43.689550,1671.00 +-80.368283,43.688550,1681.00 +-80.367300,43.687633,1691.00 +-80.365600,43.687550,1703.00 +-80.364500,43.688450,1714.00 +-80.364900,43.689467,1719.00 +-80.366100,43.689900,1724.00 +-80.367183,43.689550,1727.00 +-80.367983,43.688800,1724.00 +-80.368633,43.687900,1721.00 +-80.369267,43.686917,1729.00 +-80.369983,43.685883,1734.00 +-80.369617,43.684767,1748.00 +-80.368050,43.684667,1753.00 +-80.367250,43.685667,1754.00 +-80.368033,43.686633,1769.00 +-80.369367,43.686833,1786.00 +-80.369500,43.685817,1794.00 +-80.368050,43.685450,1802.00 +-80.366983,43.686317,1807.00 +-80.367450,43.687450,1826.00 +-80.368683,43.687833,1841.00 +-80.369167,43.686833,1849.00 +-80.368133,43.685917,1865.00 +-80.366500,43.685933,1876.00 +-80.365517,43.686883,1891.00 +-80.366150,43.687817,1907.00 +-80.367383,43.687667,1923.00 +-80.367483,43.686750,1938.00 +-80.366167,43.686217,1939.00 +-80.365267,43.687250,1942.00 +-80.366250,43.688050,1961.00 +-80.367550,43.687867,1976.00 +-80.367517,43.686917,1987.00 +-80.366083,43.686533,1992.00 +-80.364700,43.687183,1998.00 +-80.364267,43.688350,2009.00 +-80.364617,43.689517,2025.00 +-80.365867,43.690117,2039.00 +-80.366983,43.689567,2040.00 +-80.366717,43.688517,2055.00 +-80.365267,43.688317,2071.00 +-80.364017,43.689133,2070.00 +-80.364117,43.690333,2088.00 +-80.364917,43.691217,2090.00 +-80.366333,43.691267,2090.00 +-80.367100,43.690400,2093.00 +-80.367033,43.689267,2105.00 +-80.365683,43.688767,2118.00 +-80.364567,43.689583,2122.00 +-80.365217,43.690467,2133.00 +-80.366500,43.690333,2140.00 +-80.366967,43.689433,2155.00 +-80.366333,43.688550,2159.00 +-80.364783,43.688167,2167.00 +-80.363500,43.688717,2173.00 +-80.363200,43.689833,2160.00 +-80.363667,43.690933,2166.00 +-80.364467,43.691900,2175.00 +-80.365433,43.692750,2176.00 +-80.366800,43.692783,2170.00 +-80.367183,43.691783,2174.00 +-80.366267,43.690900,2186.00 +-80.364750,43.690600,2191.00 +-80.363100,43.690967,2204.00 +-80.361700,43.691650,2215.00 +-80.360750,43.692650,2219.00 +-80.361067,43.693750,2220.00 +-80.362450,43.694067,2217.00 +-80.363417,43.693350,2215.00 +-80.363200,43.692317,2217.00 +-80.361917,43.691600,2227.00 +-80.360317,43.691600,2234.00 +-80.358933,43.692300,2223.00 +-80.358833,43.693467,2230.00 +-80.360000,43.694067,2229.00 +-80.361533,43.694000,2225.00 +-80.362967,43.694000,2230.00 +-80.364383,43.693883,2232.00 +-80.365833,43.693700,2235.00 +-80.367333,43.693500,2247.00 +-80.368850,43.693317,2248.00 +-80.370533,43.693117,2248.00 +-80.372367,43.692817,2248.00 +-80.374183,43.692600,2253.00 +-80.375767,43.692517,2248.00 +-80.377450,43.692317,2229.00 +-80.379383,43.692017,2217.00 +-80.381383,43.691617,2213.00 +-80.383067,43.691167,2222.00 +-80.384517,43.690900,2224.00 +-80.385933,43.690600,2217.00 +-80.387383,43.690300,2211.00 +-80.388767,43.689917,2205.00 +-80.390167,43.689417,2196.00 +-80.391733,43.688967,2189.00 +-80.393350,43.688550,2188.00 +-80.394967,43.688200,2188.00 +-80.396533,43.687967,2185.00 +-80.398150,43.687783,2177.00 +-80.399833,43.687933,2173.00 +-80.401533,43.688150,2162.00 +-80.403333,43.688333,2151.00 +-80.405200,43.688550,2146.00 +-80.407017,43.688750,2144.00 +-80.408817,43.688933,2128.00 +-80.410733,43.689050,2128.00 +-80.412700,43.689217,2113.00 +-80.414783,43.689383,2100.00 +-80.416933,43.689467,2094.00 +-80.419050,43.689550,2085.00 +-80.421250,43.689633,2078.00 +-80.423350,43.689733,2078.00 +-80.425350,43.689800,2074.00 +-80.427233,43.689767,2074.00 +-80.429050,43.689750,2071.00 +-80.430717,43.689817,2072.00 +-80.432267,43.689700,2068.00 +-80.433717,43.689300,2060.00 +-80.435117,43.688617,2059.00 +-80.436383,43.687783,2067.00 +-80.437567,43.686700,2080.00 +-80.437483,43.685500,2099.00 +-80.436067,43.685533,2091.00 +-80.435817,43.686817,2076.00 +-80.436817,43.687933,2096.00 +-80.438267,43.688700,2109.00 +-80.439383,43.688033,2120.00 +-80.438317,43.687400,2122.00 +-80.437967,43.688667,2130.00 +-80.439433,43.689267,2151.00 +-80.440600,43.688600,2154.00 +-80.440100,43.687650,2159.00 +-80.438650,43.687383,2167.00 +-80.437233,43.687717,2188.00 +-80.436233,43.688467,2201.00 +-80.436633,43.689533,2212.00 +-80.437950,43.689933,2220.00 +-80.439050,43.689333,2222.00 +-80.439017,43.688250,2225.00 +-80.438000,43.687433,2237.00 +-80.436633,43.687017,2251.00 +-80.435417,43.687550,2252.00 +-80.435683,43.688650,2257.00 +-80.437017,43.689217,2271.00 +-80.438483,43.689117,2280.00 +-80.439583,43.688383,2283.00 +-80.438783,43.687517,2280.00 +-80.437600,43.688267,2286.00 +-80.437433,43.689500,2293.00 +-80.437600,43.690850,2293.00 +-80.437917,43.692167,2304.00 +-80.438350,43.693350,2312.00 +-80.438733,43.694550,2312.00 +-80.439133,43.695983,2303.00 +-80.439617,43.697583,2285.00 +-80.440233,43.699150,2282.00 +-80.440617,43.700883,2262.00 +-80.440817,43.702817,2240.00 +-80.440933,43.704917,2214.00 +-80.441017,43.707200,2186.00 +-80.441067,43.709483,2184.00 +-80.441067,43.711700,2175.00 +-80.441067,43.713883,2171.00 +-80.441083,43.715967,2173.00 +-80.441100,43.717900,2176.00 +-80.441067,43.719767,2174.00 +-80.441067,43.721600,2164.00 +-80.441033,43.723433,2156.00 +-80.441083,43.725267,2150.00 +-80.441150,43.727050,2152.00 +-80.441150,43.728750,2155.00 +-80.441067,43.730500,2143.00 +-80.441017,43.732283,2128.00 +-80.441083,43.734167,2118.00 +-80.441117,43.736100,2106.00 +-80.441000,43.738000,2096.00 +-80.440817,43.739817,2098.00 +-80.440683,43.741550,2093.00 +-80.440533,43.743333,2085.00 +-80.440433,43.745150,2091.00 +-80.440317,43.746883,2093.00 +-80.440217,43.748583,2089.00 +-80.440150,43.750267,2082.00 +-80.440150,43.752033,2070.00 +-80.440217,43.753917,2061.00 +-80.440117,43.755850,2054.00 +-80.439900,43.757817,2043.00 +-80.439650,43.759833,2029.00 +-80.439483,43.761867,2027.00 +-80.439367,43.763800,2027.00 +-80.439350,43.765900,2019.00 +-80.439267,43.767783,2011.00 +-80.439100,43.769617,2006.00 +-80.438983,43.771417,1993.00 +-80.438883,43.773233,1979.00 +-80.438717,43.775067,1966.00 +-80.438533,43.776933,1955.00 +-80.438350,43.778783,1949.00 +-80.438133,43.780583,1940.00 +-80.437867,43.782433,1926.00 +-80.437667,43.784350,1914.00 +-80.437583,43.786317,1903.00 +-80.437483,43.788283,1902.00 +-80.437350,43.790150,1906.00 +-80.437183,43.791950,1900.00 +-80.437017,43.793750,1893.00 +-80.436817,43.795533,1889.00 +-80.436533,43.797350,1869.00 +-80.435583,43.799100,1863.00 +-80.434467,43.800683,1862.00 +-80.433400,43.802300,1856.00 +-80.432333,43.803950,1849.00 +-80.431200,43.805617,1848.00 +-80.430017,43.807233,1855.00 +-80.428983,43.808717,1865.00 +-80.428033,43.810167,1871.00 +-80.427150,43.811550,1881.00 +-80.426250,43.812900,1889.00 +-80.425233,43.814183,1896.00 +-80.424300,43.815550,1900.00 +-80.423450,43.817000,1897.00 +-80.422700,43.818500,1887.00 +-80.421950,43.820067,1881.00 +-80.421167,43.821667,1879.00 +-80.420417,43.823317,1877.00 +-80.419767,43.825017,1874.00 +-80.418883,43.826717,1866.00 +-80.417900,43.828383,1863.00 +-80.417000,43.830017,1860.00 +-80.416100,43.831617,1852.00 +-80.415233,43.833283,1845.00 +-80.414467,43.835017,1840.00 +-80.414550,43.836550,1870.00 +-80.415967,43.836833,1884.00 +-80.416833,43.836150,1897.00 +-80.416800,43.835167,1899.00 +-80.415950,43.834283,1903.00 +-80.414400,43.833917,1903.00 +-80.412667,43.834267,1902.00 +-80.411367,43.835167,1902.00 +-80.410733,43.836367,1900.00 +-80.410783,43.837583,1902.00 +-80.411483,43.838650,1904.00 +-80.412783,43.839367,1902.00 +-80.414433,43.839783,1898.00 +-80.416150,43.840133,1911.00 +-80.417733,43.840467,1921.00 +-80.419267,43.840283,1936.00 +-80.419700,43.839367,1946.00 +-80.418933,43.838533,1957.00 +-80.417517,43.838117,1967.00 +-80.415950,43.838217,1978.00 +-80.414600,43.838883,1979.00 +-80.414333,43.840017,1983.00 +-80.415367,43.840783,1988.00 +-80.416800,43.840517,1993.00 +-80.417183,43.839533,2008.00 +-80.416300,43.838717,2018.00 +-80.414833,43.838500,2028.00 +-80.413467,43.838967,2031.00 +-80.412833,43.840000,2027.00 +-80.413317,43.841067,2029.00 +-80.414550,43.841783,2037.00 +-80.416017,43.841867,2044.00 +-80.417183,43.841333,2051.00 +-80.417700,43.840383,2059.00 +-80.417550,43.839333,2070.00 +-80.417000,43.838400,2078.00 +-80.415767,43.837800,2078.00 +-80.414150,43.837833,2077.00 +-80.412750,43.838483,2080.00 +-80.412167,43.839567,2083.00 +-80.412483,43.840667,2083.00 +-80.413417,43.841567,2087.00 +-80.414600,43.842400,2087.00 +-80.415950,43.843150,2087.00 +-80.417483,43.844000,2096.00 +-80.418817,43.844833,2112.00 +-80.420317,43.845233,2114.00 +-80.420533,43.844383,2119.00 +-80.419033,43.844117,2124.00 +-80.417350,43.844500,2136.00 +-80.416183,43.845350,2156.00 +-80.416550,43.846433,2165.00 +-80.417950,43.846567,2169.00 +-80.418200,43.845750,2171.00 +-80.416733,43.845333,2184.00 +-80.415317,43.845733,2200.00 +-80.414767,43.846767,2204.00 +-80.415017,43.848000,2206.00 +-80.415400,43.849250,2209.00 +-80.415917,43.850467,2212.00 +-80.416417,43.851667,2212.00 +-80.416967,43.852933,2199.00 +-80.417667,43.854317,2192.00 +-80.418367,43.855717,2196.00 +-80.419183,43.857000,2198.00 +-80.419883,43.858267,2193.00 +-80.420600,43.859600,2188.00 +-80.421333,43.860967,2181.00 +-80.421983,43.862367,2175.00 +-80.422467,43.863733,2177.00 +-80.422983,43.865000,2170.00 +-80.423650,43.866317,2155.00 +-80.424283,43.867767,2140.00 +-80.424950,43.869250,2135.00 +-80.425617,43.870733,2130.00 +-80.426183,43.872350,2123.00 +-80.426633,43.873817,2123.00 +-80.427167,43.875233,2119.00 +-80.427683,43.876683,2116.00 +-80.428050,43.878067,2117.00 +-80.428467,43.879417,2110.00 +-80.428933,43.880800,2102.00 +-80.429400,43.882233,2097.00 +-80.429883,43.883633,2095.00 +-80.430400,43.885017,2090.00 +-80.430900,43.886417,2087.00 +-80.431433,43.887800,2081.00 +-80.432117,43.889183,2071.00 +-80.432817,43.890633,2067.00 +-80.433500,43.892083,2065.00 +-80.434017,43.893567,2069.00 +-80.434433,43.895050,2064.00 +-80.434867,43.896517,2060.00 +-80.435383,43.897967,2050.00 +-80.435917,43.899450,2039.00 +-80.436367,43.900967,2033.00 +-80.436633,43.902383,2057.00 +-80.436700,43.903517,2075.00 +-80.436883,43.904767,2074.00 +-80.437083,43.906000,2081.00 +-80.437267,43.907083,2081.00 +-80.437550,43.908483,2081.00 +-80.437767,43.909767,2078.00 +-80.438000,43.911100,2061.00 +-80.438300,43.912567,2047.00 +-80.438567,43.914083,2039.00 +-80.438867,43.915617,2029.00 +-80.439233,43.917167,2021.00 +-80.439500,43.918733,2009.00 +-80.439800,43.920300,2006.00 +-80.440050,43.921750,2008.00 +-80.440233,43.923150,2004.00 +-80.440367,43.924550,1993.00 +-80.440500,43.926033,1982.00 +-80.440733,43.927533,1972.00 +-80.441083,43.929067,1960.00 +-80.441250,43.930633,1957.00 +-80.440950,43.932067,1968.00 +-80.440467,43.933383,1978.00 +-80.439800,43.934633,1981.00 +-80.439833,43.935900,1996.00 +-80.440867,43.936750,2008.00 +-80.441933,43.936400,2017.00 +-80.441417,43.935550,2021.00 +-80.439950,43.935333,2035.00 +-80.438650,43.935967,2045.00 +-80.438267,43.937133,2049.00 +-80.439083,43.938083,2052.00 +-80.440433,43.938050,2060.00 +-80.441050,43.937250,2066.00 +-80.440567,43.936333,2075.00 +-80.439300,43.935817,2085.00 +-80.437800,43.935650,2092.00 +-80.436283,43.936100,2090.00 +-80.435650,43.937250,2097.00 +-80.435917,43.938383,2101.00 +-80.437033,43.939000,2106.00 +-80.438350,43.939050,2111.00 +-80.439300,43.938517,2120.00 +-80.439433,43.937667,2122.00 +-80.438433,43.936900,2124.00 +-80.436917,43.936967,2137.00 +-80.435867,43.937783,2136.00 +-80.435567,43.939033,2129.00 +-80.435600,43.940333,2131.00 +-80.435900,43.941600,2131.00 +-80.436367,43.942883,2129.00 +-80.436917,43.944183,2128.00 +-80.437550,43.945450,2128.00 +-80.438183,43.946750,2124.00 +-80.438850,43.948033,2122.00 +-80.439650,43.949283,2125.00 +-80.440567,43.950633,2129.00 +-80.441450,43.951867,2132.00 +-80.442367,43.953133,2129.00 +-80.443217,43.954417,2125.00 +-80.443933,43.955667,2120.00 +-80.444650,43.956933,2108.00 +-80.445417,43.958217,2106.00 +-80.446150,43.959533,2096.00 +-80.446917,43.960833,2095.00 +-80.447400,43.962133,2095.00 +-80.447767,43.963417,2083.00 +-80.448250,43.964783,2070.00 +-80.448750,43.966200,2066.00 +-80.449233,43.967533,2069.00 +-80.449750,43.968817,2067.00 +-80.450267,43.970033,2061.00 +-80.450833,43.971333,2044.00 +-80.451617,43.972683,2034.00 +-80.452317,43.974100,2029.00 +-80.453133,43.975500,2022.00 +-80.453967,43.976867,2022.00 +-80.454783,43.978217,2022.00 +-80.455600,43.979500,2022.00 +-80.456467,43.980683,2021.00 +-80.457317,43.981900,2009.00 +-80.458150,43.983133,2005.00 +-80.458950,43.984350,2000.00 +-80.459767,43.985583,1989.00 +-80.460617,43.986867,1977.00 +-80.461417,43.988150,1970.00 +-80.462217,43.989317,1969.00 +-80.463150,43.990433,1956.00 +-80.464183,43.991567,1952.00 +-80.465217,43.992717,1948.00 +-80.466183,43.993883,1943.00 +-80.467200,43.995050,1928.00 +-80.468267,43.996267,1910.00 +-80.469367,43.997617,1895.00 +-80.470500,43.999000,1880.00 +-80.471600,44.000433,1869.00 +-80.472633,44.001883,1858.00 +-80.473717,44.003317,1850.00 +-80.474700,44.004767,1843.00 +-80.475683,44.006233,1834.00 +-80.476600,44.007700,1826.00 +-80.477517,44.009133,1817.00 +-80.478483,44.010517,1820.00 +-80.479333,44.011733,1831.00 +-80.480283,44.012867,1831.00 +-80.481350,44.014033,1834.00 +-80.482483,44.015183,1843.00 +-80.483600,44.016367,1855.00 +-80.483317,44.017867,1868.00 +-80.481683,44.018667,1877.00 +-80.480350,44.018050,1886.00 +-80.481067,44.017133,1892.00 +-80.482917,44.017283,1907.00 +-80.484033,44.018467,1929.00 +-80.483567,44.019867,1942.00 +-80.482067,44.020433,1952.00 +-80.481000,44.019783,1961.00 +-80.481600,44.018800,1967.00 +-80.483317,44.018867,1982.00 +-80.483833,44.020167,2004.00 +-80.482533,44.021067,2009.00 +-80.481183,44.020733,2015.00 +-80.481417,44.019850,2027.00 +-80.482783,44.019450,2034.00 +-80.484267,44.020300,2038.00 +-80.484067,44.021917,2036.00 +-80.482267,44.022700,2043.00 +-80.480933,44.022317,2068.00 +-80.480133,44.021600,2075.00 +-80.479417,44.020783,2087.00 +-80.479017,44.019917,2091.00 +-80.479917,44.019183,2087.00 +-80.481550,44.019483,2094.00 +-80.482700,44.020600,2103.00 +-80.483233,44.021967,2111.00 +-80.482517,44.023283,2117.00 +-80.480950,44.023783,2120.00 +-80.480100,44.023200,2134.00 +-80.481017,44.022600,2131.00 +-80.482667,44.022750,2136.00 +-80.484150,44.023533,2146.00 +-80.485333,44.024600,2148.00 +-80.486433,44.025783,2145.00 +-80.487517,44.026917,2138.00 +-80.488650,44.027950,2136.00 +-80.489733,44.029000,2129.00 +-80.490867,44.030117,2116.00 +-80.490700,44.031483,2108.00 +-80.489133,44.031717,2099.00 +-80.488350,44.030783,2088.00 +-80.487733,44.029650,2071.00 +-80.487133,44.028383,2062.00 +-80.486533,44.026967,2040.00 +-80.485917,44.025367,2022.00 +-80.485350,44.023717,2027.00 +-80.484900,44.022083,2028.00 +-80.484417,44.020517,2030.00 +-80.483933,44.018950,2029.00 +-80.483433,44.017433,2035.00 +-80.482917,44.015867,2037.00 +-80.482483,44.014250,2031.00 +-80.482000,44.012600,2019.00 +-80.481433,44.010950,2009.00 +-80.480783,44.009300,2001.00 +-80.480117,44.007650,1991.00 +-80.479450,44.005950,1977.00 +-80.478833,44.004217,1967.00 +-80.478217,44.002467,1956.00 +-80.477567,44.000683,1948.00 +-80.476900,43.998933,1946.00 +-80.476217,43.997183,1935.00 +-80.475617,43.995433,1929.00 +-80.475100,43.993717,1922.00 +-80.474567,43.992017,1911.00 +-80.473983,43.990317,1900.00 +-80.473483,43.988600,1892.00 +-80.473067,43.986883,1880.00 +-80.472633,43.985133,1866.00 +-80.472217,43.983417,1857.00 +-80.471883,43.981717,1845.00 +-80.471550,43.980033,1827.00 +-80.471183,43.978350,1813.00 +-80.470867,43.976633,1793.00 +-80.470417,43.974950,1786.00 +-80.469833,43.973117,1779.00 +-80.469183,43.971483,1775.00 +-80.468600,43.969833,1774.00 +-80.468067,43.968183,1771.00 +-80.467483,43.966483,1758.00 +-80.466867,43.964767,1749.00 +-80.466267,43.963100,1736.00 +-80.465717,43.961433,1722.00 +-80.465183,43.959783,1703.00 +-80.464617,43.958100,1685.00 +-80.464133,43.956400,1674.00 +-80.463783,43.954700,1664.00 +-80.463417,43.952983,1650.00 +-80.463033,43.951233,1642.00 +-80.462667,43.949483,1639.00 +-80.462250,43.947767,1634.00 +-80.461850,43.945983,1632.00 +-80.461467,43.944217,1639.00 +-80.461133,43.942483,1644.00 +-80.460783,43.940750,1642.00 +-80.460483,43.939017,1633.00 +-80.460200,43.937283,1628.00 +-80.459933,43.935550,1620.00 +-80.459633,43.933767,1606.00 +-80.459317,43.931950,1598.00 +-80.458950,43.930117,1590.00 +-80.458567,43.928283,1583.00 +-80.458133,43.926467,1587.00 +-80.457683,43.924733,1581.00 +-80.457267,43.923017,1575.00 +-80.456917,43.921317,1565.00 +-80.456533,43.919633,1551.00 +-80.456183,43.917933,1538.00 +-80.455817,43.916267,1520.00 +-80.455400,43.914567,1509.00 +-80.455067,43.912900,1497.00 +-80.454900,43.911283,1486.00 +-80.454733,43.909650,1464.00 +-80.454517,43.908017,1453.00 +-80.454383,43.906383,1447.00 +-80.454233,43.904767,1430.00 +-80.454033,43.902933,1408.00 +-80.453783,43.900950,1383.00 +-80.453517,43.898933,1370.00 +-80.453217,43.896983,1357.00 +-80.452867,43.895083,1349.00 +-80.452533,43.893200,1332.00 +-80.452217,43.891300,1319.00 +-80.451983,43.889383,1310.00 +-80.451767,43.887483,1300.00 +-80.451567,43.885533,1300.00 +-80.451367,43.883650,1303.00 +-80.451150,43.881833,1303.00 +-80.450833,43.880033,1295.00 +-80.450400,43.878250,1282.00 +-80.449850,43.876450,1271.00 +-80.449300,43.874617,1254.00 +-80.448950,43.872667,1241.00 +-80.448750,43.870633,1235.00 +-80.448717,43.868600,1232.00 +-80.448750,43.866567,1230.00 +-80.448800,43.864583,1226.00 +-80.448883,43.862600,1217.00 +-80.449067,43.860683,1213.00 +-80.449450,43.858883,1210.00 +-80.450083,43.857167,1202.00 +-80.450900,43.855517,1197.00 +-80.451850,43.853967,1191.00 +-80.452817,43.852467,1184.00 +-80.453533,43.850983,1180.00 +-80.454167,43.849367,1177.00 +-80.454617,43.847900,1167.00 +-80.455050,43.846350,1156.00 +-80.455317,43.844733,1145.00 +-80.455333,43.843067,1138.00 +-80.455217,43.841450,1142.00 +-80.455067,43.839950,1145.00 +-80.454850,43.838517,1149.00 +-80.454583,43.837267,1153.00 +-80.454167,43.836083,1138.00 +-80.453483,43.834967,1132.00 +-80.452700,43.833900,1119.00 +-80.451717,43.832800,1107.00 +-80.450633,43.831667,1099.00 +-80.449400,43.830550,1081.00 +-80.448217,43.829417,1065.00 +-80.447017,43.828350,1049.00 +-80.445867,43.827350,1043.00 +-80.444683,43.826433,1021.00 +-80.443350,43.825600,997.00 +-80.441833,43.824883,972.00 +-80.440083,43.824383,952.00 +-80.438200,43.824050,933.00 +-80.436283,43.823900,915.00 +-80.434350,43.824083,900.00 +-80.432483,43.824517,885.00 +-80.430700,43.825133,867.00 +-80.428983,43.825817,846.00 +-80.427300,43.826550,830.00 +-80.425733,43.827333,814.00 +-80.424217,43.828167,799.00 +-80.422750,43.829083,783.00 +-80.421333,43.830050,762.00 +-80.420200,43.831217,746.00 +-80.419800,43.832567,736.00 +-80.420200,43.833850,723.00 +-80.421250,43.834967,711.00 +-80.422550,43.835967,699.00 +-80.423917,43.836917,691.00 +-80.425367,43.837883,680.00 +-80.426800,43.838917,662.00 +-80.428100,43.840067,648.00 +-80.429167,43.841300,636.00 +-80.430033,43.842617,629.00 +-80.430733,43.844033,623.00 +-80.431250,43.845567,622.00 +-80.431583,43.847067,618.00 +-80.431950,43.848550,609.00 +-80.432533,43.849917,603.00 +-80.433750,43.850917,596.00 +-80.435317,43.851267,586.00 +-80.436950,43.851283,574.00 +-80.438617,43.851017,558.00 +-80.440267,43.850617,543.00 +-80.441800,43.850050,529.00 +-80.443267,43.849383,511.00 +-80.444617,43.848583,496.00 +-80.445483,43.847517,484.00 +-80.445250,43.846283,472.00 +-80.444717,43.845050,459.00 +-80.444150,43.843833,451.00 +-80.443633,43.842650,444.00 +-80.443167,43.841567,443.00 +-80.442850,43.840800,443.00 +-80.442750,43.840550,443.00 +-80.442750,43.840550,443.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840567,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442750,43.840550,444.00 +-80.442733,43.840533,444.00 +-80.442700,43.840483,444.00 +-80.442650,43.840433,445.00 +-80.442583,43.840383,444.00 +-80.442517,43.840317,444.00 +-80.442450,43.840267,444.00 +-80.442383,43.840200,444.00 +-80.442300,43.840150,444.00 +-80.442233,43.840117,444.00 +-80.442200,43.840067,444.00 +-80.442167,43.840017,444.00 +-80.442117,43.839983,444.00 +-80.442067,43.839933,444.00 +-80.442033,43.839900,444.00 +-80.441983,43.839850,444.00 +-80.441933,43.839817,444.00 +-80.441883,43.839767,444.00 +-80.441833,43.839733,444.00 +-80.441767,43.839683,444.00 +-80.441717,43.839650,444.00 +-80.441650,43.839617,444.00 +-80.441600,43.839567,444.00 +-80.441533,43.839533,444.00 +-80.441500,43.839483,444.00 +-80.441433,43.839450,444.00 +-80.441350,43.839400,444.00 +-80.441317,43.839367,444.00 +-80.441250,43.839317,444.00 +-80.441200,43.839283,444.00 +-80.441150,43.839250,444.00 +-80.441100,43.839200,444.00 +-80.441067,43.839167,443.00 +-80.441017,43.839133,443.00 +-80.440967,43.839083,444.00 +-80.440933,43.839050,443.00 +-80.440883,43.839017,443.00 +-80.440817,43.838983,443.00 +-80.440767,43.838933,443.00 +-80.440700,43.838900,443.00 +-80.440667,43.838867,443.00 +-80.440617,43.838817,444.00 +-80.440533,43.838767,444.00 +-80.440483,43.838733,444.00 +-80.440433,43.838700,443.00 +-80.440383,43.838650,444.00 +-80.440333,43.838600,444.00 +-80.440267,43.838567,443.00 +-80.440233,43.838533,443.00 +-80.440183,43.838483,444.00 +-80.440117,43.838450,444.00 +-80.440083,43.838417,443.00 +-80.440033,43.838383,443.00 +-80.439983,43.838350,444.00 +-80.439950,43.838300,443.00 +-80.439883,43.838267,444.00 +-80.439850,43.838233,444.00 +-80.439800,43.838183,444.00 +-80.439750,43.838150,444.00 +-80.439717,43.838117,444.00 +-80.439683,43.838083,444.00 +-80.439617,43.838050,443.00 +-80.439567,43.838000,443.00 +-80.439517,43.837967,444.00 +-80.439483,43.837933,443.00 +-80.439433,43.837900,443.00 +-80.439367,43.837867,444.00 +-80.439317,43.837817,444.00 +-80.439250,43.837783,443.00 +-80.439200,43.837733,443.00 +-80.439150,43.837700,443.00 +-80.439100,43.837667,443.00 +-80.439050,43.837633,443.00 +-80.439000,43.837600,443.00 +-80.438950,43.837550,443.00 +-80.438900,43.837517,443.00 +-80.438833,43.837483,443.00 +-80.438783,43.837450,443.00 + + + + + + GNSSALTTRK + + + +Description IGCHDRS~HFFXA015~HFPLTPILOTINCHARGE:CHRIS RAZL~HFCM2CREW2: ~HFGTYGLIDERTYPE:LS 4~HFGIDGLIDERID:~HFDTM100GPSDATUM:WGS-1984~HFRFWFIRMWAREVERSION:1.60~HFRHWHARDWAREVERSION:1.00~HFFTYFRTYPE:LX Eos~HFGPS:uBLOX-LEA-6S,50ch,max50000m~HFPRSPRESSALTSENSOR:INTERSEMA,MS5607,max15000m~HFCIDCOMPETITIONID:~HFCCLCOMPETITIONCLASS:~ +Distance 90.4 mi +Min Alt 1519.029 ft +Max Alt 7903.543 ft +Min Speed 0.8 mph +Max Speed 113.8 mph +Avg Speed 60.4 mph +Start Time 2022-07-16T19:41:31Z +End Time 2022-07-16T21:11:20Z + +]]> + + + 2022-07-16T19:41:31Z + 2022-07-16T21:11:20Z + + + Path + #lineStyle + + 1 + absolute + +-80.443083,43.840333,463.00 +-80.443083,43.840333,463.00 +-80.443083,43.840333,463.00 +-80.442617,43.839933,463.00 +-80.441667,43.839200,463.00 +-80.440567,43.838433,464.00 +-80.439233,43.837517,466.00 +-80.437850,43.836533,484.00 +-80.436450,43.835600,503.00 +-80.435117,43.834700,524.00 +-80.433833,43.833833,543.00 +-80.432483,43.833000,557.00 +-80.431400,43.832050,574.00 +-80.430767,43.830933,584.00 +-80.430767,43.829700,590.00 +-80.431133,43.828533,601.00 +-80.431967,43.827483,611.00 +-80.433300,43.826650,626.00 +-80.434950,43.826117,638.00 +-80.436800,43.825667,656.00 +-80.438317,43.825250,672.00 +-80.440050,43.825017,687.00 +-80.441817,43.825250,697.00 +-80.443417,43.825967,702.00 +-80.444700,43.827117,709.00 +-80.445300,43.828633,719.00 +-80.445100,43.830217,738.00 +-80.444250,43.831683,748.00 +-80.442550,43.832883,755.00 +-80.440667,43.833500,765.00 +-80.438600,43.833683,773.00 +-80.436650,43.833267,782.00 +-80.435117,43.832383,790.00 +-80.434150,43.831200,799.00 +-80.433833,43.829900,811.00 +-80.434267,43.828650,820.00 +-80.435350,43.827617,834.00 +-80.436817,43.826950,856.00 +-80.438400,43.826483,869.00 +-80.439983,43.826083,879.00 +-80.441567,43.825700,888.00 +-80.443217,43.825317,895.00 +-80.444850,43.824883,917.00 +-80.446267,43.824200,936.00 +-80.447117,43.823100,952.00 +-80.447167,43.821850,970.00 +-80.446417,43.820617,972.00 +-80.444900,43.819717,978.00 +-80.442883,43.819250,986.00 +-80.440683,43.819350,1000.00 +-80.438333,43.820033,1011.00 +-80.436700,43.821067,1024.00 +-80.434900,43.822217,1045.00 +-80.432783,43.822983,1057.00 +-80.430450,43.823183,1068.00 +-80.428217,43.822950,1082.00 +-80.426083,43.822233,1099.00 +-80.424683,43.821150,1116.00 +-80.423833,43.819800,1124.00 +-80.423767,43.818350,1135.00 +-80.424400,43.817033,1155.00 +-80.425667,43.816033,1160.00 +-80.427400,43.815400,1168.00 +-80.429400,43.815200,1177.00 +-80.431450,43.815367,1194.00 +-80.433483,43.815633,1213.00 +-80.435483,43.815517,1233.00 +-80.437300,43.814950,1252.00 +-80.438550,43.813850,1276.00 +-80.438850,43.812467,1296.00 +-80.438283,43.811150,1323.00 +-80.437033,43.810083,1349.00 +-80.435283,43.809367,1375.00 +-80.432900,43.809350,1391.00 +-80.430750,43.809950,1410.00 +-80.429117,43.809300,1414.00 +-80.427983,43.808300,1417.00 +-80.427067,43.807283,1412.00 +-80.425767,43.806633,1407.00 +-80.424533,43.807233,1402.00 +-80.424433,43.808267,1400.00 +-80.425217,43.809133,1395.00 +-80.426517,43.809633,1394.00 +-80.428017,43.809800,1393.00 +-80.429567,43.809767,1384.00 +-80.431083,43.809567,1383.00 +-80.432583,43.809317,1389.00 +-80.434083,43.808967,1400.00 +-80.434733,43.808067,1415.00 +-80.433900,43.807333,1425.00 +-80.432517,43.807600,1440.00 +-80.431917,43.808567,1451.00 +-80.432533,43.809533,1459.00 +-80.433900,43.809750,1470.00 +-80.434967,43.809000,1479.00 +-80.434883,43.808033,1494.00 +-80.433683,43.807633,1508.00 +-80.432600,43.808233,1527.00 +-80.432683,43.809283,1533.00 +-80.433933,43.809817,1545.00 +-80.435117,43.809400,1560.00 +-80.435283,43.808483,1565.00 +-80.434300,43.807800,1577.00 +-80.432933,43.807950,1596.00 +-80.432150,43.808833,1612.00 +-80.432667,43.809950,1617.00 +-80.434017,43.810300,1631.00 +-80.435250,43.809933,1643.00 +-80.436217,43.809083,1659.00 +-80.435717,43.808200,1670.00 +-80.434367,43.808000,1676.00 +-80.433183,43.808700,1693.00 +-80.433233,43.809800,1712.00 +-80.434617,43.810167,1724.00 +-80.435617,43.809400,1738.00 +-80.435033,43.808533,1750.00 +-80.433600,43.808583,1753.00 +-80.432950,43.809700,1773.00 +-80.433483,43.810800,1787.00 +-80.435017,43.811067,1800.00 +-80.436033,43.810283,1813.00 +-80.435650,43.809317,1822.00 +-80.434000,43.809100,1829.00 +-80.432850,43.809933,1847.00 +-80.432517,43.811067,1862.00 +-80.433733,43.811683,1872.00 +-80.434950,43.811167,1883.00 +-80.434833,43.810183,1896.00 +-80.433483,43.809817,1900.00 +-80.432267,43.810533,1919.00 +-80.432500,43.811567,1935.00 +-80.433817,43.811933,1943.00 +-80.434867,43.811283,1955.00 +-80.434717,43.810367,1968.00 +-80.433517,43.809850,1978.00 +-80.432033,43.810100,1993.00 +-80.431267,43.811050,2001.00 +-80.431600,43.812083,2002.00 +-80.432783,43.812750,2000.00 +-80.434267,43.812533,2007.00 +-80.434917,43.811567,2019.00 +-80.434283,43.810550,2029.00 +-80.432750,43.810283,2051.00 +-80.431500,43.810967,2065.00 +-80.431317,43.812017,2072.00 +-80.432133,43.812850,2071.00 +-80.433450,43.813300,2079.00 +-80.434850,43.813383,2092.00 +-80.435733,43.812700,2093.00 +-80.435333,43.811700,2090.00 +-80.433933,43.811300,2098.00 +-80.432483,43.811700,2117.00 +-80.432167,43.812750,2122.00 +-80.433300,43.813467,2133.00 +-80.434483,43.813100,2144.00 +-80.434733,43.812217,2149.00 +-80.433833,43.811417,2150.00 +-80.432450,43.811633,2172.00 +-80.431950,43.812650,2170.00 +-80.432867,43.813567,2183.00 +-80.434233,43.813417,2198.00 +-80.434767,43.812550,2200.00 +-80.434017,43.811700,2211.00 +-80.432517,43.811800,2223.00 +-80.431917,43.812883,2230.00 +-80.432817,43.813767,2239.00 +-80.434117,43.813517,2253.00 +-80.434300,43.812600,2254.00 +-80.433133,43.812000,2271.00 +-80.431817,43.812517,2277.00 +-80.431600,43.813667,2284.00 +-80.432667,43.814417,2292.00 +-80.433900,43.814017,2300.00 +-80.434000,43.813067,2300.00 +-80.432650,43.812833,2315.00 +-80.431700,43.813650,2312.00 +-80.432317,43.814683,2314.00 +-80.433767,43.815017,2319.00 +-80.435250,43.814850,2316.00 +-80.436467,43.814283,2307.00 +-80.436550,43.813300,2304.00 +-80.435483,43.812550,2315.00 +-80.434117,43.812117,2311.00 +-80.432633,43.812583,2310.00 +-80.432300,43.813750,2320.00 +-80.433433,43.814467,2322.00 +-80.434767,43.814050,2324.00 +-80.434717,43.813033,2335.00 +-80.433383,43.812633,2337.00 +-80.432083,43.813150,2328.00 +-80.432117,43.814433,2329.00 +-80.432550,43.815750,2321.00 +-80.433067,43.817150,2315.00 +-80.433650,43.818650,2314.00 +-80.434467,43.820100,2322.00 +-80.435967,43.820100,2343.00 +-80.436100,43.819167,2341.00 +-80.435233,43.818217,2318.00 +-80.433733,43.817283,2307.00 +-80.432033,43.816450,2305.00 +-80.430167,43.815717,2301.00 +-80.428183,43.815050,2297.00 +-80.426133,43.814483,2292.00 +-80.424017,43.813967,2284.00 +-80.421867,43.813417,2286.00 +-80.420200,43.812900,2322.00 +-80.418750,43.812450,2311.00 +-80.417233,43.811883,2310.00 +-80.415567,43.811367,2300.00 +-80.413683,43.810767,2287.00 +-80.411750,43.810050,2278.00 +-80.409733,43.809367,2269.00 +-80.407667,43.808667,2258.00 +-80.405600,43.807817,2246.00 +-80.403567,43.806883,2240.00 +-80.401533,43.805983,2235.00 +-80.399700,43.805167,2251.00 +-80.397983,43.804483,2246.00 +-80.396000,43.803917,2223.00 +-80.393850,43.803217,2208.00 +-80.391833,43.802383,2204.00 +-80.390033,43.801517,2200.00 +-80.388400,43.800600,2197.00 +-80.386883,43.799633,2192.00 +-80.385317,43.798533,2186.00 +-80.383900,43.797517,2178.00 +-80.382517,43.796450,2178.00 +-80.381283,43.795317,2180.00 +-80.380267,43.794083,2197.00 +-80.379533,43.792983,2210.00 +-80.378967,43.791983,2208.00 +-80.378450,43.790883,2193.00 +-80.377833,43.789633,2181.00 +-80.377183,43.788300,2171.00 +-80.376517,43.786900,2163.00 +-80.375850,43.785467,2147.00 +-80.375217,43.783933,2138.00 +-80.374633,43.782500,2140.00 +-80.374117,43.781100,2132.00 +-80.373717,43.779650,2120.00 +-80.373333,43.778150,2106.00 +-80.373000,43.776583,2090.00 +-80.372633,43.774950,2078.00 +-80.372267,43.773317,2069.00 +-80.371933,43.771733,2073.00 +-80.371617,43.770217,2071.00 +-80.371150,43.768733,2068.00 +-80.370617,43.767300,2064.00 +-80.370033,43.765850,2052.00 +-80.369367,43.764333,2039.00 +-80.368717,43.762750,2025.00 +-80.368050,43.761083,2014.00 +-80.367367,43.759417,2004.00 +-80.366800,43.757733,2000.00 +-80.366283,43.756100,1992.00 +-80.365783,43.754467,1985.00 +-80.365367,43.752833,1978.00 +-80.364917,43.751200,1961.00 +-80.364450,43.749517,1957.00 +-80.363883,43.747783,1951.00 +-80.363350,43.746083,1955.00 +-80.362750,43.744417,1955.00 +-80.362200,43.742750,1956.00 +-80.361567,43.741083,1950.00 +-80.360983,43.739400,1936.00 +-80.360383,43.737667,1926.00 +-80.359733,43.735950,1919.00 +-80.359050,43.734200,1904.00 +-80.358317,43.732417,1893.00 +-80.357617,43.730483,1899.00 +-80.357033,43.728850,1899.00 +-80.356500,43.727217,1891.00 +-80.355983,43.725550,1880.00 +-80.355350,43.723833,1865.00 +-80.354700,43.722133,1851.00 +-80.354083,43.720483,1842.00 +-80.353583,43.718900,1836.00 +-80.353150,43.717333,1828.00 +-80.352650,43.715750,1813.00 +-80.352000,43.714067,1798.00 +-80.351183,43.712400,1792.00 +-80.350367,43.710750,1788.00 +-80.349417,43.709217,1793.00 +-80.348567,43.707833,1809.00 +-80.347850,43.706617,1816.00 +-80.346983,43.705567,1810.00 +-80.346517,43.704450,1807.00 +-80.347133,43.703383,1804.00 +-80.348217,43.702467,1814.00 +-80.349300,43.701550,1812.00 +-80.350450,43.700683,1805.00 +-80.351683,43.699867,1795.00 +-80.352967,43.699033,1782.00 +-80.354367,43.698200,1772.00 +-80.355867,43.697400,1764.00 +-80.357267,43.696533,1762.00 +-80.358633,43.695717,1753.00 +-80.359983,43.694967,1747.00 +-80.361317,43.694167,1738.00 +-80.362583,43.693250,1732.00 +-80.363833,43.692283,1732.00 +-80.365100,43.691367,1738.00 +-80.366250,43.690450,1744.00 +-80.367400,43.689550,1749.00 +-80.368283,43.688550,1758.00 +-80.367300,43.687633,1771.00 +-80.365600,43.687550,1784.00 +-80.364500,43.688450,1796.00 +-80.364900,43.689467,1802.00 +-80.366100,43.689900,1806.00 +-80.367183,43.689550,1808.00 +-80.367983,43.688800,1804.00 +-80.368633,43.687900,1801.00 +-80.369267,43.686917,1809.00 +-80.369983,43.685883,1814.00 +-80.369617,43.684767,1829.00 +-80.368050,43.684667,1834.00 +-80.367250,43.685667,1838.00 +-80.368033,43.686633,1853.00 +-80.369367,43.686833,1870.00 +-80.369500,43.685817,1880.00 +-80.368050,43.685450,1888.00 +-80.366983,43.686317,1893.00 +-80.367450,43.687450,1914.00 +-80.368683,43.687833,1927.00 +-80.369167,43.686833,1936.00 +-80.368133,43.685917,1955.00 +-80.366500,43.685933,1967.00 +-80.365517,43.686883,1981.00 +-80.366150,43.687817,1999.00 +-80.367383,43.687667,2015.00 +-80.367483,43.686750,2032.00 +-80.366167,43.686217,2031.00 +-80.365267,43.687250,2035.00 +-80.366250,43.688050,2055.00 +-80.367550,43.687867,2069.00 +-80.367517,43.686917,2081.00 +-80.366083,43.686533,2088.00 +-80.364700,43.687183,2094.00 +-80.364267,43.688350,2104.00 +-80.364617,43.689517,2118.00 +-80.365867,43.690117,2135.00 +-80.366983,43.689567,2132.00 +-80.366717,43.688517,2150.00 +-80.365267,43.688317,2167.00 +-80.364017,43.689133,2165.00 +-80.364117,43.690333,2186.00 +-80.364917,43.691217,2185.00 +-80.366333,43.691267,2187.00 +-80.367100,43.690400,2188.00 +-80.367033,43.689267,2201.00 +-80.365683,43.688767,2214.00 +-80.364567,43.689583,2218.00 +-80.365217,43.690467,2231.00 +-80.366500,43.690333,2238.00 +-80.366967,43.689433,2255.00 +-80.366333,43.688550,2257.00 +-80.364783,43.688167,2267.00 +-80.363500,43.688717,2274.00 +-80.363200,43.689833,2258.00 +-80.363667,43.690933,2267.00 +-80.364467,43.691900,2273.00 +-80.365433,43.692750,2272.00 +-80.366800,43.692783,2265.00 +-80.367183,43.691783,2271.00 +-80.366267,43.690900,2285.00 +-80.364750,43.690600,2290.00 +-80.363100,43.690967,2303.00 +-80.361700,43.691650,2315.00 +-80.360750,43.692650,2319.00 +-80.361067,43.693750,2320.00 +-80.362450,43.694067,2314.00 +-80.363417,43.693350,2315.00 +-80.363200,43.692317,2317.00 +-80.361917,43.691600,2328.00 +-80.360317,43.691600,2336.00 +-80.358933,43.692300,2323.00 +-80.358833,43.693467,2332.00 +-80.360000,43.694067,2330.00 +-80.361533,43.694000,2325.00 +-80.362967,43.694000,2331.00 +-80.364383,43.693883,2331.00 +-80.365833,43.693700,2333.00 +-80.367333,43.693500,2346.00 +-80.368850,43.693317,2345.00 +-80.370533,43.693117,2345.00 +-80.372367,43.692817,2346.00 +-80.374183,43.692600,2352.00 +-80.375767,43.692517,2346.00 +-80.377450,43.692317,2326.00 +-80.379383,43.692017,2313.00 +-80.381383,43.691617,2308.00 +-80.383067,43.691167,2321.00 +-80.384517,43.690900,2322.00 +-80.385933,43.690600,2315.00 +-80.387383,43.690300,2308.00 +-80.388767,43.689917,2303.00 +-80.390167,43.689417,2293.00 +-80.391733,43.688967,2285.00 +-80.393350,43.688550,2285.00 +-80.394967,43.688200,2286.00 +-80.396533,43.687967,2283.00 +-80.398150,43.687783,2274.00 +-80.399833,43.687933,2270.00 +-80.401533,43.688150,2257.00 +-80.403333,43.688333,2245.00 +-80.405200,43.688550,2238.00 +-80.407017,43.688750,2236.00 +-80.408817,43.688933,2229.00 +-80.410733,43.689050,2218.00 +-80.412700,43.689217,2200.00 +-80.414783,43.689383,2185.00 +-80.416933,43.689467,2179.00 +-80.419050,43.689550,2168.00 +-80.421250,43.689633,2160.00 +-80.423350,43.689733,2161.00 +-80.425350,43.689800,2158.00 +-80.427233,43.689767,2157.00 +-80.429050,43.689750,2154.00 +-80.430717,43.689817,2157.00 +-80.432267,43.689700,2152.00 +-80.433717,43.689300,2146.00 +-80.435117,43.688617,2145.00 +-80.436383,43.687783,2152.00 +-80.437567,43.686700,2164.00 +-80.437483,43.685500,2187.00 +-80.436067,43.685533,2180.00 +-80.435817,43.686817,2164.00 +-80.436817,43.687933,2185.00 +-80.438267,43.688700,2200.00 +-80.439383,43.688033,2210.00 +-80.438317,43.687400,2211.00 +-80.437967,43.688667,2224.00 +-80.439433,43.689267,2248.00 +-80.440600,43.688600,2250.00 +-80.440100,43.687650,2256.00 +-80.438650,43.687383,2264.00 +-80.437233,43.687717,2286.00 +-80.436233,43.688467,2298.00 +-80.436633,43.689533,2311.00 +-80.437950,43.689933,2321.00 +-80.439050,43.689333,2321.00 +-80.439017,43.688250,2323.00 +-80.438000,43.687433,2335.00 +-80.436633,43.687017,2350.00 +-80.435417,43.687550,2351.00 +-80.435683,43.688650,2359.00 +-80.437017,43.689217,2373.00 +-80.438483,43.689117,2381.00 +-80.439583,43.688383,2380.00 +-80.438783,43.687517,2376.00 +-80.437600,43.688267,2385.00 +-80.437433,43.689500,2391.00 +-80.437600,43.690850,2390.00 +-80.437917,43.692167,2400.00 +-80.438350,43.693350,2409.00 +-80.438733,43.694550,2405.00 +-80.439133,43.695983,2395.00 +-80.439617,43.697583,2393.00 +-80.440233,43.699150,2384.00 +-80.440617,43.700883,2365.00 +-80.440817,43.702817,2342.00 +-80.440933,43.704917,2315.00 +-80.441017,43.707200,2286.00 +-80.441067,43.709483,2283.00 +-80.441067,43.711700,2273.00 +-80.441067,43.713883,2268.00 +-80.441083,43.715967,2270.00 +-80.441100,43.717900,2271.00 +-80.441067,43.719767,2268.00 +-80.441067,43.721600,2257.00 +-80.441033,43.723433,2250.00 +-80.441083,43.725267,2243.00 +-80.441150,43.727050,2246.00 +-80.441150,43.728750,2248.00 +-80.441067,43.730500,2236.00 +-80.441017,43.732283,2221.00 +-80.441083,43.734167,2210.00 +-80.441117,43.736100,2198.00 +-80.441000,43.738000,2188.00 +-80.440817,43.739817,2190.00 +-80.440683,43.741550,2183.00 +-80.440533,43.743333,2174.00 +-80.440433,43.745150,2179.00 +-80.440317,43.746883,2182.00 +-80.440217,43.748583,2178.00 +-80.440150,43.750267,2171.00 +-80.440150,43.752033,2159.00 +-80.440217,43.753917,2149.00 +-80.440117,43.755850,2143.00 +-80.439900,43.757817,2131.00 +-80.439650,43.759833,2119.00 +-80.439483,43.761867,2116.00 +-80.439367,43.763800,2114.00 +-80.439350,43.765900,2105.00 +-80.439267,43.767783,2096.00 +-80.439100,43.769617,2092.00 +-80.438983,43.771417,2078.00 +-80.438883,43.773233,2063.00 +-80.438717,43.775067,2050.00 +-80.438533,43.776933,2039.00 +-80.438350,43.778783,2032.00 +-80.438133,43.780583,2022.00 +-80.437867,43.782433,2009.00 +-80.437667,43.784350,1996.00 +-80.437583,43.786317,1986.00 +-80.437483,43.788283,1986.00 +-80.437350,43.790150,1990.00 +-80.437183,43.791950,1982.00 +-80.437017,43.793750,1975.00 +-80.436817,43.795533,1970.00 +-80.436533,43.797350,1951.00 +-80.435583,43.799100,1948.00 +-80.434467,43.800683,1946.00 +-80.433400,43.802300,1940.00 +-80.432333,43.803950,1934.00 +-80.431200,43.805617,1934.00 +-80.430017,43.807233,1942.00 +-80.428983,43.808717,1953.00 +-80.428033,43.810167,1959.00 +-80.427150,43.811550,1968.00 +-80.426250,43.812900,1975.00 +-80.425233,43.814183,1983.00 +-80.424300,43.815550,1988.00 +-80.423450,43.817000,1984.00 +-80.422700,43.818500,1973.00 +-80.421950,43.820067,1967.00 +-80.421167,43.821667,1965.00 +-80.420417,43.823317,1963.00 +-80.419767,43.825017,1961.00 +-80.418883,43.826717,1952.00 +-80.417900,43.828383,1949.00 +-80.417000,43.830017,1945.00 +-80.416100,43.831617,1937.00 +-80.415233,43.833283,1930.00 +-80.414467,43.835017,1926.00 +-80.414550,43.836550,1954.00 +-80.415967,43.836833,1971.00 +-80.416833,43.836150,1983.00 +-80.416800,43.835167,1987.00 +-80.415950,43.834283,1990.00 +-80.414400,43.833917,1990.00 +-80.412667,43.834267,1991.00 +-80.411367,43.835167,1992.00 +-80.410733,43.836367,1990.00 +-80.410783,43.837583,1992.00 +-80.411483,43.838650,1992.00 +-80.412783,43.839367,1992.00 +-80.414433,43.839783,1987.00 +-80.416150,43.840133,2000.00 +-80.417733,43.840467,2009.00 +-80.419267,43.840283,2024.00 +-80.419700,43.839367,2035.00 +-80.418933,43.838533,2046.00 +-80.417517,43.838117,2056.00 +-80.415950,43.838217,2068.00 +-80.414600,43.838883,2072.00 +-80.414333,43.840017,2078.00 +-80.415367,43.840783,2084.00 +-80.416800,43.840517,2088.00 +-80.417183,43.839533,2103.00 +-80.416300,43.838717,2113.00 +-80.414833,43.838500,2123.00 +-80.413467,43.838967,2126.00 +-80.412833,43.840000,2122.00 +-80.413317,43.841067,2125.00 +-80.414550,43.841783,2134.00 +-80.416017,43.841867,2140.00 +-80.417183,43.841333,2147.00 +-80.417700,43.840383,2155.00 +-80.417550,43.839333,2166.00 +-80.417000,43.838400,2175.00 +-80.415767,43.837800,2174.00 +-80.414150,43.837833,2173.00 +-80.412750,43.838483,2177.00 +-80.412167,43.839567,2182.00 +-80.412483,43.840667,2179.00 +-80.413417,43.841567,2184.00 +-80.414600,43.842400,2184.00 +-80.415950,43.843150,2183.00 +-80.417483,43.844000,2192.00 +-80.418817,43.844833,2208.00 +-80.420317,43.845233,2212.00 +-80.420533,43.844383,2216.00 +-80.419033,43.844117,2220.00 +-80.417350,43.844500,2235.00 +-80.416183,43.845350,2256.00 +-80.416550,43.846433,2266.00 +-80.417950,43.846567,2271.00 +-80.418200,43.845750,2270.00 +-80.416733,43.845333,2286.00 +-80.415317,43.845733,2303.00 +-80.414767,43.846767,2309.00 +-80.415017,43.848000,2309.00 +-80.415400,43.849250,2312.00 +-80.415917,43.850467,2314.00 +-80.416417,43.851667,2311.00 +-80.416967,43.852933,2297.00 +-80.417667,43.854317,2291.00 +-80.418367,43.855717,2295.00 +-80.419183,43.857000,2297.00 +-80.419883,43.858267,2289.00 +-80.420600,43.859600,2284.00 +-80.421333,43.860967,2276.00 +-80.421983,43.862367,2269.00 +-80.422467,43.863733,2273.00 +-80.422983,43.865000,2265.00 +-80.423650,43.866317,2249.00 +-80.424283,43.867767,2234.00 +-80.424950,43.869250,2228.00 +-80.425617,43.870733,2223.00 +-80.426183,43.872350,2216.00 +-80.426633,43.873817,2216.00 +-80.427167,43.875233,2210.00 +-80.427683,43.876683,2207.00 +-80.428050,43.878067,2208.00 +-80.428467,43.879417,2201.00 +-80.428933,43.880800,2192.00 +-80.429400,43.882233,2188.00 +-80.429883,43.883633,2186.00 +-80.430400,43.885017,2179.00 +-80.430900,43.886417,2176.00 +-80.431433,43.887800,2171.00 +-80.432117,43.889183,2161.00 +-80.432817,43.890633,2156.00 +-80.433500,43.892083,2155.00 +-80.434017,43.893567,2159.00 +-80.434433,43.895050,2153.00 +-80.434867,43.896517,2148.00 +-80.435383,43.897967,2138.00 +-80.435917,43.899450,2126.00 +-80.436367,43.900967,2120.00 +-80.436633,43.902383,2144.00 +-80.436700,43.903517,2162.00 +-80.436883,43.904767,2160.00 +-80.437083,43.906000,2168.00 +-80.437267,43.907083,2168.00 +-80.437550,43.908483,2167.00 +-80.437767,43.909767,2164.00 +-80.438000,43.911100,2148.00 +-80.438300,43.912567,2134.00 +-80.438567,43.914083,2125.00 +-80.438867,43.915617,2116.00 +-80.439233,43.917167,2107.00 +-80.439500,43.918733,2096.00 +-80.439800,43.920300,2092.00 +-80.440050,43.921750,2094.00 +-80.440233,43.923150,2089.00 +-80.440367,43.924550,2078.00 +-80.440500,43.926033,2067.00 +-80.440733,43.927533,2057.00 +-80.441083,43.929067,2045.00 +-80.441250,43.930633,2044.00 +-80.440950,43.932067,2055.00 +-80.440467,43.933383,2062.00 +-80.439800,43.934633,2066.00 +-80.439833,43.935900,2082.00 +-80.440867,43.936750,2095.00 +-80.441933,43.936400,2106.00 +-80.441417,43.935550,2111.00 +-80.439950,43.935333,2126.00 +-80.438650,43.935967,2138.00 +-80.438267,43.937133,2143.00 +-80.439083,43.938083,2148.00 +-80.440433,43.938050,2155.00 +-80.441050,43.937250,2162.00 +-80.440567,43.936333,2171.00 +-80.439300,43.935817,2181.00 +-80.437800,43.935650,2187.00 +-80.436283,43.936100,2186.00 +-80.435650,43.937250,2194.00 +-80.435917,43.938383,2199.00 +-80.437033,43.939000,2205.00 +-80.438350,43.939050,2209.00 +-80.439300,43.938517,2217.00 +-80.439433,43.937667,2219.00 +-80.438433,43.936900,2221.00 +-80.436917,43.936967,2235.00 +-80.435867,43.937783,2233.00 +-80.435567,43.939033,2227.00 +-80.435600,43.940333,2229.00 +-80.435900,43.941600,2227.00 +-80.436367,43.942883,2224.00 +-80.436917,43.944183,2224.00 +-80.437550,43.945450,2222.00 +-80.438183,43.946750,2218.00 +-80.438850,43.948033,2216.00 +-80.439650,43.949283,2220.00 +-80.440567,43.950633,2226.00 +-80.441450,43.951867,2226.00 +-80.442367,43.953133,2223.00 +-80.443217,43.954417,2219.00 +-80.443933,43.955667,2212.00 +-80.444650,43.956933,2201.00 +-80.445417,43.958217,2198.00 +-80.446150,43.959533,2189.00 +-80.446917,43.960833,2188.00 +-80.447400,43.962133,2188.00 +-80.447767,43.963417,2174.00 +-80.448250,43.964783,2160.00 +-80.448750,43.966200,2156.00 +-80.449233,43.967533,2158.00 +-80.449750,43.968817,2157.00 +-80.450267,43.970033,2149.00 +-80.450833,43.971333,2132.00 +-80.451617,43.972683,2123.00 +-80.452317,43.974100,2119.00 +-80.453133,43.975500,2111.00 +-80.453967,43.976867,2112.00 +-80.454783,43.978217,2112.00 +-80.455600,43.979500,2113.00 +-80.456467,43.980683,2111.00 +-80.457317,43.981900,2099.00 +-80.458150,43.983133,2095.00 +-80.458950,43.984350,2090.00 +-80.459767,43.985583,2079.00 +-80.460617,43.986867,2066.00 +-80.461417,43.988150,2059.00 +-80.462217,43.989317,2057.00 +-80.463150,43.990433,2045.00 +-80.464183,43.991567,2040.00 +-80.465217,43.992717,2037.00 +-80.466183,43.993883,2032.00 +-80.467200,43.995050,2018.00 +-80.468267,43.996267,2000.00 +-80.469367,43.997617,1985.00 +-80.470500,43.999000,1969.00 +-80.471600,44.000433,1957.00 +-80.472633,44.001883,1947.00 +-80.473717,44.003317,1937.00 +-80.474700,44.004767,1931.00 +-80.475683,44.006233,1921.00 +-80.476600,44.007700,1912.00 +-80.477517,44.009133,1903.00 +-80.478483,44.010517,1907.00 +-80.479333,44.011733,1917.00 +-80.480283,44.012867,1916.00 +-80.481350,44.014033,1921.00 +-80.482483,44.015183,1930.00 +-80.483600,44.016367,1941.00 +-80.483317,44.017867,1957.00 +-80.481683,44.018667,1966.00 +-80.480350,44.018050,1976.00 +-80.481067,44.017133,1982.00 +-80.482917,44.017283,1997.00 +-80.484033,44.018467,2020.00 +-80.483567,44.019867,2032.00 +-80.482067,44.020433,2042.00 +-80.481000,44.019783,2052.00 +-80.481600,44.018800,2058.00 +-80.483317,44.018867,2075.00 +-80.483833,44.020167,2096.00 +-80.482533,44.021067,2102.00 +-80.481183,44.020733,2107.00 +-80.481417,44.019850,2120.00 +-80.482783,44.019450,2129.00 +-80.484267,44.020300,2133.00 +-80.484067,44.021917,2130.00 +-80.482267,44.022700,2137.00 +-80.480933,44.022317,2161.00 +-80.480133,44.021600,2171.00 +-80.479417,44.020783,2183.00 +-80.479017,44.019917,2186.00 +-80.479917,44.019183,2183.00 +-80.481550,44.019483,2190.00 +-80.482700,44.020600,2199.00 +-80.483233,44.021967,2206.00 +-80.482517,44.023283,2212.00 +-80.480950,44.023783,2216.00 +-80.480100,44.023200,2230.00 +-80.481017,44.022600,2230.00 +-80.482667,44.022750,2235.00 +-80.484150,44.023533,2244.00 +-80.485333,44.024600,2245.00 +-80.486433,44.025783,2240.00 +-80.487517,44.026917,2234.00 +-80.488650,44.027950,2232.00 +-80.489733,44.029000,2224.00 +-80.490867,44.030117,2211.00 +-80.490700,44.031483,2204.00 +-80.489133,44.031717,2193.00 +-80.488350,44.030783,2184.00 +-80.487733,44.029650,2167.00 +-80.487133,44.028383,2153.00 +-80.486533,44.026967,2130.00 +-80.485917,44.025367,2110.00 +-80.485350,44.023717,2117.00 +-80.484900,44.022083,2119.00 +-80.484417,44.020517,2120.00 +-80.483933,44.018950,2119.00 +-80.483433,44.017433,2126.00 +-80.482917,44.015867,2127.00 +-80.482483,44.014250,2121.00 +-80.482000,44.012600,2110.00 +-80.481433,44.010950,2100.00 +-80.480783,44.009300,2091.00 +-80.480117,44.007650,2081.00 +-80.479450,44.005950,2067.00 +-80.478833,44.004217,2056.00 +-80.478217,44.002467,2046.00 +-80.477567,44.000683,2037.00 +-80.476900,43.998933,2035.00 +-80.476217,43.997183,2023.00 +-80.475617,43.995433,2017.00 +-80.475100,43.993717,2010.00 +-80.474567,43.992017,2000.00 +-80.473983,43.990317,1988.00 +-80.473483,43.988600,1980.00 +-80.473067,43.986883,1967.00 +-80.472633,43.985133,1953.00 +-80.472217,43.983417,1944.00 +-80.471883,43.981717,1932.00 +-80.471550,43.980033,1914.00 +-80.471183,43.978350,1899.00 +-80.470867,43.976633,1878.00 +-80.470417,43.974950,1869.00 +-80.469833,43.973117,1862.00 +-80.469183,43.971483,1859.00 +-80.468600,43.969833,1858.00 +-80.468067,43.968183,1853.00 +-80.467483,43.966483,1841.00 +-80.466867,43.964767,1831.00 +-80.466267,43.963100,1818.00 +-80.465717,43.961433,1804.00 +-80.465183,43.959783,1784.00 +-80.464617,43.958100,1767.00 +-80.464133,43.956400,1754.00 +-80.463783,43.954700,1744.00 +-80.463417,43.952983,1729.00 +-80.463033,43.951233,1722.00 +-80.462667,43.949483,1719.00 +-80.462250,43.947767,1713.00 +-80.461850,43.945983,1712.00 +-80.461467,43.944217,1720.00 +-80.461133,43.942483,1726.00 +-80.460783,43.940750,1721.00 +-80.460483,43.939017,1712.00 +-80.460200,43.937283,1708.00 +-80.459933,43.935550,1699.00 +-80.459633,43.933767,1684.00 +-80.459317,43.931950,1676.00 +-80.458950,43.930117,1668.00 +-80.458567,43.928283,1660.00 +-80.458133,43.926467,1666.00 +-80.457683,43.924733,1659.00 +-80.457267,43.923017,1652.00 +-80.456917,43.921317,1642.00 +-80.456533,43.919633,1628.00 +-80.456183,43.917933,1615.00 +-80.455817,43.916267,1596.00 +-80.455400,43.914567,1585.00 +-80.455067,43.912900,1571.00 +-80.454900,43.911283,1560.00 +-80.454733,43.909650,1538.00 +-80.454517,43.908017,1525.00 +-80.454383,43.906383,1521.00 +-80.454233,43.904767,1503.00 +-80.454033,43.902933,1479.00 +-80.453783,43.900950,1453.00 +-80.453517,43.898933,1441.00 +-80.453217,43.896983,1427.00 +-80.452867,43.895083,1418.00 +-80.452533,43.893200,1401.00 +-80.452217,43.891300,1387.00 +-80.451983,43.889383,1377.00 +-80.451767,43.887483,1367.00 +-80.451567,43.885533,1367.00 +-80.451367,43.883650,1371.00 +-80.451150,43.881833,1369.00 +-80.450833,43.880033,1362.00 +-80.450400,43.878250,1348.00 +-80.449850,43.876450,1336.00 +-80.449300,43.874617,1319.00 +-80.448950,43.872667,1305.00 +-80.448750,43.870633,1299.00 +-80.448717,43.868600,1295.00 +-80.448750,43.866567,1293.00 +-80.448800,43.864583,1290.00 +-80.448883,43.862600,1279.00 +-80.449067,43.860683,1276.00 +-80.449450,43.858883,1271.00 +-80.450083,43.857167,1263.00 +-80.450900,43.855517,1257.00 +-80.451850,43.853967,1251.00 +-80.452817,43.852467,1244.00 +-80.453533,43.850983,1239.00 +-80.454167,43.849367,1236.00 +-80.454617,43.847900,1225.00 +-80.455050,43.846350,1213.00 +-80.455317,43.844733,1201.00 +-80.455333,43.843067,1195.00 +-80.455217,43.841450,1200.00 +-80.455067,43.839950,1202.00 +-80.454850,43.838517,1207.00 +-80.454583,43.837267,1210.00 +-80.454167,43.836083,1196.00 +-80.453483,43.834967,1189.00 +-80.452700,43.833900,1177.00 +-80.451717,43.832800,1164.00 +-80.450633,43.831667,1155.00 +-80.449400,43.830550,1137.00 +-80.448217,43.829417,1118.00 +-80.447017,43.828350,1103.00 +-80.445867,43.827350,1096.00 +-80.444683,43.826433,1073.00 +-80.443350,43.825600,1048.00 +-80.441833,43.824883,1022.00 +-80.440083,43.824383,1000.00 +-80.438200,43.824050,980.00 +-80.436283,43.823900,962.00 +-80.434350,43.824083,947.00 +-80.432483,43.824517,932.00 +-80.430700,43.825133,913.00 +-80.428983,43.825817,891.00 +-80.427300,43.826550,873.00 +-80.425733,43.827333,857.00 +-80.424217,43.828167,840.00 +-80.422750,43.829083,823.00 +-80.421333,43.830050,801.00 +-80.420200,43.831217,784.00 +-80.419800,43.832567,773.00 +-80.420200,43.833850,761.00 +-80.421250,43.834967,750.00 +-80.422550,43.835967,737.00 +-80.423917,43.836917,729.00 +-80.425367,43.837883,717.00 +-80.426800,43.838917,699.00 +-80.428100,43.840067,684.00 +-80.429167,43.841300,671.00 +-80.430033,43.842617,664.00 +-80.430733,43.844033,658.00 +-80.431250,43.845567,657.00 +-80.431583,43.847067,651.00 +-80.431950,43.848550,642.00 +-80.432533,43.849917,634.00 +-80.433750,43.850917,626.00 +-80.435317,43.851267,618.00 +-80.436950,43.851283,604.00 +-80.438617,43.851017,588.00 +-80.440267,43.850617,571.00 +-80.441800,43.850050,556.00 +-80.443267,43.849383,538.00 +-80.444617,43.848583,521.00 +-80.445483,43.847517,507.00 +-80.445250,43.846283,497.00 +-80.444717,43.845050,483.00 +-80.444150,43.843833,474.00 +-80.443633,43.842650,468.00 +-80.443167,43.841567,467.00 +-80.442850,43.840800,468.00 +-80.442750,43.840550,468.00 +-80.442750,43.840550,469.00 +-80.442750,43.840550,469.00 +-80.442750,43.840550,469.00 +-80.442750,43.840550,469.00 +-80.442750,43.840550,469.00 +-80.442750,43.840567,468.00 +-80.442750,43.840567,468.00 +-80.442750,43.840567,468.00 +-80.442750,43.840567,467.00 +-80.442750,43.840567,467.00 +-80.442750,43.840567,467.00 +-80.442750,43.840567,467.00 +-80.442750,43.840567,466.00 +-80.442750,43.840567,466.00 +-80.442750,43.840567,466.00 +-80.442750,43.840567,466.00 +-80.442750,43.840567,466.00 +-80.442750,43.840567,465.00 +-80.442750,43.840567,465.00 +-80.442750,43.840567,465.00 +-80.442750,43.840567,465.00 +-80.442750,43.840567,466.00 +-80.442750,43.840567,467.00 +-80.442750,43.840567,468.00 +-80.442750,43.840567,469.00 +-80.442750,43.840567,469.00 +-80.442750,43.840567,470.00 +-80.442750,43.840550,471.00 +-80.442750,43.840550,471.00 +-80.442750,43.840550,472.00 +-80.442750,43.840550,472.00 +-80.442750,43.840550,472.00 +-80.442750,43.840550,473.00 +-80.442750,43.840550,473.00 +-80.442750,43.840550,473.00 +-80.442750,43.840550,474.00 +-80.442750,43.840550,474.00 +-80.442750,43.840550,474.00 +-80.442750,43.840550,473.00 +-80.442750,43.840550,473.00 +-80.442750,43.840550,473.00 +-80.442750,43.840550,473.00 +-80.442733,43.840533,473.00 +-80.442700,43.840483,473.00 +-80.442650,43.840433,473.00 +-80.442583,43.840383,473.00 +-80.442517,43.840317,473.00 +-80.442450,43.840267,473.00 +-80.442383,43.840200,473.00 +-80.442300,43.840150,473.00 +-80.442233,43.840117,473.00 +-80.442200,43.840067,473.00 +-80.442167,43.840017,473.00 +-80.442117,43.839983,473.00 +-80.442067,43.839933,473.00 +-80.442033,43.839900,474.00 +-80.441983,43.839850,473.00 +-80.441933,43.839817,473.00 +-80.441883,43.839767,473.00 +-80.441833,43.839733,473.00 +-80.441767,43.839683,473.00 +-80.441717,43.839650,473.00 +-80.441650,43.839617,473.00 +-80.441600,43.839567,474.00 +-80.441533,43.839533,474.00 +-80.441500,43.839483,474.00 +-80.441433,43.839450,474.00 +-80.441350,43.839400,473.00 +-80.441317,43.839367,473.00 +-80.441250,43.839317,473.00 +-80.441200,43.839283,473.00 +-80.441150,43.839250,473.00 +-80.441100,43.839200,473.00 +-80.441067,43.839167,473.00 +-80.441017,43.839133,473.00 +-80.440967,43.839083,473.00 +-80.440933,43.839050,473.00 +-80.440883,43.839017,473.00 +-80.440817,43.838983,473.00 +-80.440767,43.838933,473.00 +-80.440700,43.838900,473.00 +-80.440667,43.838867,473.00 +-80.440617,43.838817,473.00 +-80.440533,43.838767,473.00 +-80.440483,43.838733,473.00 +-80.440433,43.838700,472.00 +-80.440383,43.838650,473.00 +-80.440333,43.838600,473.00 +-80.440267,43.838567,473.00 +-80.440233,43.838533,473.00 +-80.440183,43.838483,474.00 +-80.440117,43.838450,474.00 +-80.440083,43.838417,473.00 +-80.440033,43.838383,474.00 +-80.439983,43.838350,474.00 +-80.439950,43.838300,474.00 +-80.439883,43.838267,474.00 +-80.439850,43.838233,474.00 +-80.439800,43.838183,475.00 +-80.439750,43.838150,475.00 +-80.439717,43.838117,475.00 +-80.439683,43.838083,476.00 +-80.439617,43.838050,476.00 +-80.439567,43.838000,476.00 +-80.439517,43.837967,477.00 +-80.439483,43.837933,477.00 +-80.439433,43.837900,477.00 +-80.439367,43.837867,478.00 +-80.439317,43.837817,478.00 +-80.439250,43.837783,478.00 +-80.439200,43.837733,478.00 +-80.439150,43.837700,478.00 +-80.439100,43.837667,478.00 +-80.439050,43.837633,478.00 +-80.439000,43.837600,478.00 +-80.438950,43.837550,478.00 +-80.438900,43.837517,478.00 +-80.438833,43.837483,478.00 +-80.438783,43.837450,478.00 + + + + + + + Routes + + 0001 + + Path + #lineStyle + + 1 + absolute + +-80.436650,43.835000 +-81.410550,43.163600 +-81.063033,44.156950 +-80.286667,43.874700 +-80.436650,43.835000 +-80.436650,43.835000 + + + + + + + diff --git a/reference/track/92GV66G1.igc.kml b/reference/track/92GV66G1.igc.kml index 5e325be05..390afe661 100644 --- a/reference/track/92GV66G1.igc.kml +++ b/reference/track/92GV66G1.igc.kml @@ -110,6 +110,29 @@ 6 + + + Engine Noise + + + True Airspd + + + Otsd Air Temp + + + Ttl Enrg Vario + + + Ground Speed + + + Fix Accuracy + + + Z Accel + + Tracks @@ -1567,7 +1590,7 @@ -81.838083 28.408050 51.00 - + 31 1 4 @@ -2293,7 +2316,7 @@ 15 4 - + 0 0 0 @@ -3019,7 +3042,7 @@ 0 0 - + 26.1 26.1 26.1 @@ -3745,7 +3768,7 @@ 22.6 22.6 - + 1.1 0.7 0.3 @@ -4471,7 +4494,7 @@ 0 -0.1 - + 0.31 0.08 0.05 @@ -5197,7 +5220,7 @@ 0.02 0.01 - + 7 6 7 @@ -5923,7 +5946,7 @@ 7 7 - + 9 9 9 @@ -8108,7 +8131,7 @@ -81.838083 28.408050 28.00 - + 31 1 4 @@ -8834,7 +8857,7 @@ 15 4 - + 0 0 0 @@ -9560,7 +9583,7 @@ 0 0 - + 26.1 26.1 26.1 @@ -10286,7 +10309,7 @@ 22.6 22.6 - + 1.1 0.7 0.3 @@ -11012,7 +11035,7 @@ 0 -0.1 - + 0.31 0.08 0.05 @@ -11738,7 +11761,7 @@ 0.02 0.01 - + 7 6 7 @@ -12464,7 +12487,7 @@ 7 7 - + 9 9 9 diff --git a/reference/track/92HV66G1.igc.kml b/reference/track/92HV66G1.igc.kml index 91600f937..7975e47aa 100644 --- a/reference/track/92HV66G1.igc.kml +++ b/reference/track/92HV66G1.igc.kml @@ -110,6 +110,29 @@ 6 + + + Engine Noise + + + True Airspd + + + Otsd Air Temp + + + Ttl Enrg Vario + + + Ground Speed + + + Fix Accuracy + + + Z Accel + + Tracks @@ -5059,7 +5082,7 @@ -81.837917 28.408033 29.00 - + 4 4 4 @@ -7531,7 +7554,7 @@ 4 4 - + 0 0 0 @@ -10003,7 +10026,7 @@ 0 0 - + 28 28 28 @@ -12475,7 +12498,7 @@ 25.4 25.4 - + 0 0 0 @@ -14947,7 +14970,7 @@ 0 0.1 - + 0.19 0.05 0.03 @@ -17419,7 +17442,7 @@ 0.02 0.02 - + 8 8 8 @@ -19891,7 +19914,7 @@ 5 5 - + 9 9 9 @@ -27314,7 +27337,7 @@ -81.837917 28.408033 35.00 - + 4 4 4 @@ -29786,7 +29809,7 @@ 4 4 - + 0 0 0 @@ -32258,7 +32281,7 @@ 0 0 - + 28 28 28 @@ -34730,7 +34753,7 @@ 25.4 25.4 - + 0 0 0 @@ -37202,7 +37225,7 @@ 0 0.1 - + 0.19 0.05 0.03 @@ -39674,7 +39697,7 @@ 0.02 0.02 - + 8 8 8 @@ -42146,7 +42169,7 @@ 5 5 - + 9 9 9 diff --git a/reference/track/gpx_garmin_extensions-kml_track.kml b/reference/track/gpx_garmin_extensions-kml_track.kml index 81236455d..d4f43574f 100644 --- a/reference/track/gpx_garmin_extensions-kml_track.kml +++ b/reference/track/gpx_garmin_extensions-kml_track.kml @@ -111,12 +111,12 @@ - - Heart Rate - Cadence + + Heart Rate + Waypoints diff --git a/reference/track/gtrnctr_power-kml.kml b/reference/track/gtrnctr_power-kml.kml index 8c3b11c52..dea07b9d8 100644 --- a/reference/track/gtrnctr_power-kml.kml +++ b/reference/track/gtrnctr_power-kml.kml @@ -111,12 +111,12 @@ - - Heart Rate - Cadence + + Heart Rate + Power diff --git a/reference/umsonstdraussen.gpx b/reference/umsonstdraussen.gpx index 2361b770c..096bfdd8d 100644 --- a/reference/umsonstdraussen.gpx +++ b/reference/umsonstdraussen.gpx @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ Waypoint - + Luitpoldstrasse Freising @@ -32,7 +32,7 @@ Waypoint - + Zeughausstrasse Darmstadt @@ -51,7 +51,7 @@ Waypoint - + Bretten / Grillplatz / B 35 Bretten @@ -69,7 +69,7 @@ Waypoint - + Alter Elbtunnel / St. Pauli LandungsbrÃŧcken Hamburg @@ -88,7 +88,7 @@ Waypoint - + Heubergpark / Alte RoßmÃŧhlstraße Wesel @@ -106,7 +106,7 @@ Waypoint - + Prinzipalmarkt MÃŧnster @@ -125,7 +125,7 @@ Waypoint - + FrÃļnsberg Hemer @@ -136,14 +136,14 @@ Umsonst + Draußen WÃŧrzburg - Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mama s Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, SchÃļne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. - Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mama s Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, SchÃļne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. + Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mamas Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, SchÃļne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. + Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mamas Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, SchÃļne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr. www.umsonst-und-draussen.de Waypoint - + Talavera WÃŧrzburg @@ -162,7 +162,7 @@ Waypoint - + Kasernenstrasse Bad Kissingen @@ -180,7 +180,7 @@ Waypoint - + Solebadstrasse Bad Salzdetfurth @@ -198,7 +198,7 @@ Waypoint - + Zwischen Potsdamer und Berliner Ufer Hamburg @@ -216,7 +216,7 @@ Waypoint - + Parkanlage Stuttgart-Rohr Stuttgart @@ -235,7 +235,7 @@ Waypoint - + Himmelreichgelände bei den HessenhÃļfen Blaubeuren @@ -253,7 +253,7 @@ Waypoint - + Ossenbergweg HÃŧnxe @@ -271,7 +271,7 @@ Waypoint - + Rappenberghalde TÃŧbingen @@ -290,7 +290,7 @@ Waypoint - + Ginsterweg Bad Wildbad @@ -308,7 +308,7 @@ Waypoint - + Zuiderpark Den Haag @@ -326,7 +326,7 @@ Waypoint - + Im LÃļwental Essen @@ -345,7 +345,7 @@ Waypoint - + Neu-Isenburg Neu-Isenburg @@ -363,7 +363,7 @@ Waypoint - + Straubenhardt 75334 @@ -380,7 +380,7 @@ Waypoint - + Hafenstraße Hamm @@ -399,7 +399,7 @@ Waypoint - + Heidjerstraße Weener @@ -418,7 +418,7 @@ Waypoint - + Altstadt Iserlohn @@ -436,7 +436,7 @@ Waypoint - + GÃŧnther-Klutz-Anlage Karlsruhe @@ -455,7 +455,7 @@ Waypoint - + Donauinsel Wien @@ -474,7 +474,7 @@ Waypoint - + Obstmarkt Backnang @@ -493,7 +493,7 @@ Waypoint - + Am Kohschultenhof Lingen @@ -511,7 +511,7 @@ Waypoint - + Falkenstein Donnersdorf-Falkenstein @@ -530,7 +530,7 @@ Waypoint - + Schloßberg Pegnitz @@ -548,7 +548,7 @@ Waypoint - + Firstwaldstrasse MÃļssingen @@ -566,7 +566,7 @@ Waypoint - + Weserwiese Veltheim Vlotho @@ -584,7 +584,7 @@ Waypoint - + Hintere Insel Lindau @@ -602,7 +602,7 @@ Waypoint - + Am Saupurzl Karlstadt @@ -620,7 +620,7 @@ Waypoint - + Heubach 73540 @@ -637,7 +637,7 @@ Waypoint - + Volksfestplatz am Stadion Erding @@ -656,7 +656,7 @@ Waypoint - + SÃŧdwinsen 29308 @@ -673,7 +673,7 @@ Waypoint - + Andlauer Weg Berlin @@ -691,7 +691,7 @@ Waypoint - + Freizeitpark Rheinaue Bonn @@ -710,7 +710,7 @@ Waypoint - + Stadionweg Garching @@ -728,7 +728,7 @@ Waypoint - + im Lerchenfeld Dornstadt bei Ulm @@ -746,7 +746,7 @@ Waypoint - + Riedweg Hausen am Andelsbach @@ -765,7 +765,7 @@ Waypoint - + Karlsstraße Reutlingen @@ -783,7 +783,7 @@ Waypoint - + Noch nicht bekannt MÃļnchengladbach @@ -801,7 +801,7 @@ Waypoint - + Am Werratalsee Schwebda @@ -820,7 +820,7 @@ Waypoint - + Liebigstraße FlÃļrsheim @@ -839,7 +839,7 @@ Waypoint - + Rathausplatz Meldorf @@ -857,7 +857,7 @@ Waypoint - + Innenstadt NÃŧrnberg NÃŧrnberg @@ -876,7 +876,7 @@ Waypoint - + Innenstadt Regensburg Regensburg @@ -894,7 +894,7 @@ Waypoint - + Innenstadt Bochum Bochum @@ -913,7 +913,7 @@ Waypoint - + Schießmauer Herrenberg @@ -931,7 +931,7 @@ Waypoint - + Firstwaldstrasse MÃļssingen @@ -949,7 +949,7 @@ Waypoint - + Weserwiese Veltheim Vlotho @@ -967,7 +967,7 @@ Waypoint - + Volksfestplatz am Stadion Erding @@ -986,7 +986,7 @@ Waypoint - + Moorfleeter Deich Hamburg @@ -1004,7 +1004,7 @@ Waypoint - + Geinsheimer Straße Riedstadt-Leeheim @@ -1023,7 +1023,7 @@ Waypoint - + An den St Pauli LandungsbrÃŧcken Hamburg @@ -1041,7 +1041,7 @@ Waypoint - + Pfaffenwaldring Stuttgart @@ -1059,7 +1059,7 @@ Waypoint - + Koppelbergstrasse Teterow @@ -1077,7 +1077,7 @@ Waypoint - + Ilweder Strasse Stemwede-Haldem @@ -1095,7 +1095,7 @@ Waypoint - + Festivalgelände Bakum (BÃŧschel) @@ -1113,7 +1113,7 @@ Waypoint - + Schlossstraße Hofheim @@ -1131,7 +1131,7 @@ Waypoint - + Oberransbach Feuchtwangen @@ -1149,7 +1149,7 @@ Waypoint - + Am Rheinufer/In der Reduit Mainz-Kastel @@ -1167,7 +1167,7 @@ Waypoint - + RÃļmersee Bad Rappenau-Zimmerhof @@ -1185,7 +1185,7 @@ Waypoint - + Vestische Straße Oberhausen @@ -1203,7 +1203,7 @@ Waypoint - + Thomasstrasse Halver @@ -1221,7 +1221,7 @@ Waypoint - + Werdensteinstrasse Dellmensingen bei Ulm @@ -1239,7 +1239,7 @@ Waypoint - + Holter Straße Schloß Holte-Stukenbrock @@ -1257,7 +1257,7 @@ Waypoint - + Am Gogenkrog Neustadt in Holstein @@ -1276,7 +1276,7 @@ Waypoint - + HÃļllchenstrasse DÃļrnberg @@ -1295,7 +1295,7 @@ Waypoint - + An der alten Kirche Krefeld @@ -1314,7 +1314,7 @@ Waypoint - + Kennedyplatz Essen @@ -1333,7 +1333,7 @@ Waypoint - + Peschmannstrasse Duisburg @@ -1351,7 +1351,7 @@ Waypoint - + Am Steinchen Neu-Anspach @@ -1369,7 +1369,7 @@ Waypoint - + Grindelhof/Siemersallee/Allendeplatz Hamburg @@ -1387,7 +1387,7 @@ Waypoint - + FlÃļgger Strand Fehmarn @@ -1406,7 +1406,7 @@ Waypoint - + Treuchtlingen Ri. MÃļhren, links Ri. Haag Treuchtlingen @@ -1425,7 +1425,7 @@ Waypoint - + An den Klärteichen Emsdetten diff --git a/reference/unidelim.csv b/reference/unidelim.csv new file mode 100644 index 000000000..370084bd5 --- /dev/null +++ b/reference/unidelim.csv @@ -0,0 +1,2 @@ +lat,lon,"foo; bar;","bam wham",name,desc,"zoom|zap",notes +41.90270080,12.49623520,this,that,"Roma, 🇮🇹","my ""roam'n"" holiday",the other thing,fun diff --git a/reference/unidelim.gpx b/reference/unidelim.gpx new file mode 100644 index 000000000..b5812dd96 --- /dev/null +++ b/reference/unidelim.gpx @@ -0,0 +1,10 @@ + + + + + + Roma, 🇮🇹 + my "roam'n" holiday + fun + + diff --git a/reference/usage.txt b/reference/usage.txt index c009447fb..86feadd62 100644 --- a/reference/usage.txt +++ b/reference/usage.txt @@ -1,4 +1,4 @@ -GPSBabel Version 1.8.0. https://www.gpsbabel.org +GPSBabel Version 1.9.0. https://www.gpsbabel.org Usage: ./gpsbabel [options] -i INTYPE -f INFILE [filter] -o OUTTYPE -F OUTFILE diff --git a/reference/validate_debug.log b/reference/validate_debug.log index 85e4f47e9..55630cc0c 100644 --- a/reference/validate_debug.log +++ b/reference/validate_debug.log @@ -3,11 +3,11 @@ Processing waypts point ct: 2, waypt_count: 2 Processing routes -route 0 ct: 2, waypt_count: 2 -route head ct: 1, route_count: 1 +route 0 ct: 2, waypt_count: 2, segments 1 +route head ct: 1, route_count: 1, total segment count: 1 total route point ct: 2, route_waypt_count: 2 Processing tracks -track 0 ct: 2, waypt_count: 2 -track head ct: 1, track_count: 1 +track 0 ct: 2, waypt_count: 2, segments 1 +track head ct: 1, track_count: 1, total segment count: 1 total track point ct: 2, track_waypt_count: 2 diff --git a/reference/wptsequence.gpx b/reference/wptsequence.gpx new file mode 100644 index 000000000..881f958e7 --- /dev/null +++ b/reference/wptsequence.gpx @@ -0,0 +1,76 @@ + + + + + + 289.200 + + 33.333 + 111.1 + trkpt-2011-07-02T17:47:25.000Z + this is the wpt cmt + this is the wpt desc + this is the wpt src + http://www.gpsbabel.org + gpsbabel.org + Campground + T + 3d + 4 + 1.100000 + 2.200000 + 3.300000 + 4.4 + 55 + + + + 289.200 + + 33.333 + 111.1 + trkpt-2011-07-02T17:47:25.000Z + this is the rte cmt + this is the rte desc + this is the rte src + http://www.gpsbabel.org + gpsbabel.org + Campground + T + 3d + 4 + 1.100000 + 2.200000 + 3.300000 + 4.4 + 55 + + + + + + 289.200 + + 12.120000 + 13.818100 + 33.333 + 111.1 + trkpt-2011-07-02T17:47:25.000Z + this is the trk cmt + this is the trk desc + this is the trk src + http://www.gpsbabel.org + gpsbabel.org + Campground + T + 3d + 4 + 1.100000 + 2.200000 + 3.300000 + 4.4 + 55 + + + + diff --git a/resample.cc b/resample.cc index a7eb97313..74a77d84a 100644 --- a/resample.cc +++ b/resample.cc @@ -24,12 +24,13 @@ #include // for round #include // for optional #include // for tuple, tuple_element<>::type +#include // for as_const #include // for QDebug #include // for QList<>::const_iterator #include // for QString #include // for qSetRealNumberPrecision -#include // for qDebug, qAsConst, qint64 +#include // for qDebug, qint64 #include "defs.h" // for Waypoint, route_head, fatal, WaypointList, track_add_wpt, track_disp_all, RouteList, track_add_head, track_del_wpt, track_swap, UrlList, gb_color, global_options, global_opts #include "src/core/datetime.h" // for DateTime @@ -88,7 +89,7 @@ void ResampleFilter::average_waypoint(Waypoint* wpt, bool zero_stuffed) } counter = 0; if (global_opts.debug_level >= 5) { - for (const auto& [pos, avc, alt] : qAsConst(history)) { + for (const auto& [pos, avc, alt] : std::as_const(history)) { qDebug() << "initial conditions" << pos << avc << alt; } qDebug() << "initial accumulator" << accumulated_position << accumulated_altitude_valid_count << accumulated_altitude; diff --git a/rgbcolors.cc b/rgbcolors.cc index fbb2e12ea..a82fa3f8b 100644 --- a/rgbcolors.cc +++ b/rgbcolors.cc @@ -219,31 +219,31 @@ static int HexByte(const char* hex) */ int -color_to_bbggrr(const char* opt_color) +color_to_bbggrr(const char* cname) { char* ep; - int color_num = strtol(opt_color, &ep, 10); + int color_num = strtol(cname, &ep, 10); - if (ep != opt_color) { + if (ep != cname) { return color_num; } - if (opt_color[0] == '#') { - color_num = (HexByte(opt_color+1)) + // red - (HexByte(opt_color+3)<<8) + // green - (HexByte(opt_color+5)<<16); // blue + if (cname[0] == '#') { + color_num = (HexByte(cname+1)) + // red + (HexByte(cname+3)<<8) + // green + (HexByte(cname+5)<<16); // blue return color_num; } for (auto i : color_table) { - if (0 == case_ignore_strcmp(opt_color, i.cn)) { + if (0 == case_ignore_strcmp(cname, i.cn)) { return (i.b << 16) + (i.g << 8) + i.r; } } - fatal("unrecognized color name %s\n", opt_color); + fatal("unrecognized color name %s\n", cname); return -1; } diff --git a/route.cc b/route.cc index a83e9dd88..34b728a47 100644 --- a/route.cc +++ b/route.cc @@ -20,6 +20,7 @@ #include // for assert #include // for nullptr_t #include // for optional, operator>, operator< +#include // for as_const #include // for operator>, QDateTime, operator< #include // for QList<>::const_iterator @@ -38,8 +39,6 @@ RouteList* global_route_list; RouteList* global_track_list; -extern void update_common_traits(const Waypoint* wpt); - void route_init() { @@ -47,27 +46,27 @@ route_init() global_track_list = new RouteList; } -unsigned int +int route_waypt_count() { /* total waypoint count -- all routes */ return global_route_list->waypt_count(); } -unsigned int +int route_count() { return global_route_list->count(); /* total # of routes */ } -unsigned int +int track_waypt_count() { /* total waypoint count -- all tracks */ return global_track_list->waypt_count(); } -unsigned int +int track_count() { return global_track_list->count(); /* total # of tracks */ @@ -207,13 +206,13 @@ route_deinit() } void -route_append(RouteList* src) +route_append(const RouteList* src) { src->copy(&global_route_list); } void -track_append(RouteList* src) +track_append(const RouteList* src) { src->copy(&global_track_list); } @@ -279,16 +278,12 @@ computed_trkdata track_recompute(const route_head* trk) /* * gcdist and heading want radians, not degrees. */ - double tlat = RAD(thisw->latitude); - double tlon = RAD(thisw->longitude); - double plat = RAD(prev->latitude); - double plon = RAD(prev->longitude); if (!thisw->course_has_value()) { // Only recompute course if the waypoint // didn't already have a course. - thisw->set_course(heading_true_degrees(plat, plon, tlat, tlon)); + thisw->set_course(heading_true_degrees(prev->position(), thisw->position())); } - double dist = radtometers(gcdist(plat, plon, tlat, tlon)); + double dist = radtometers(gcdist(prev->position(), thisw->position())); tdata.distance_meters += dist; /* @@ -446,9 +441,6 @@ RouteList::add_wpt(route_head* rte, Waypoint* wpt, bool synth, QStringView namep { ++waypt_ct; rte->waypoint_list.add_rte_waypt(waypt_ct, wpt, synth, namepart, number_digits); - if ((this == global_route_list) || (this == global_track_list)) { - update_common_traits(wpt); - } } void @@ -467,7 +459,7 @@ RouteList::del_marked_wpts(route_head* rte) // mimic trkseg handling from WaypointList::del_rte_waypt bool inherit_new_trkseg = false; - for (Waypoint* wpt : qAsConst(oldlist)) { + for (Waypoint* wpt : std::as_const(oldlist)) { if (wpt->wpt_flags.marked_for_deletion) { if (wpt->wpt_flags.new_trkseg) { inherit_new_trkseg = true; diff --git a/shape.cc b/shape.cc index 94321902b..19af063af 100644 --- a/shape.cc +++ b/shape.cc @@ -144,7 +144,7 @@ ShapeFormat::DBFCreateGpsbabel(const QString& pszFilename) } #endif -void ShapeFormat::dump_fields() const +[[noreturn]] void ShapeFormat::dump_fields() const { char name[12]; warning(MYNAME ": Database fields:\n"); @@ -218,21 +218,17 @@ ShapeFormat::read() if (qopt_name.contains('+')) { // form a compound name from one or more fields. nameidx = -2; -#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0)) - const QStringList opt_name_fields = qopt_name.split('+', QString::SkipEmptyParts); -#else const QStringList opt_name_fields = qopt_name.split('+', Qt::SkipEmptyParts); -#endif nameindices.reserve(opt_name_fields.size()); - for (int oidx=0; oidxDBFOpen() pszDBFFile: The name of the xBase (.dbf) file to access. pszAccess: The fopen() style access string. At this time only - "rb" (read-only binary) and "rb+" (read/write binary) + "rb" (read-only binary) and "rb+" (read/write binary) should be used. The DBFOpen() function should be used to establish access to an existing - xBase format table file. The returned DBFHandle is passed to other - access functions, and DBFClose() should be invoked to recover resources, and + xBase format table file. The returned DBFHandle is passed to other + access functions, and DBFClose() should be invoked to recover resources, and flush changes to disk when complete. The DBFCreate() function should called to create new xBase files. As a convenience, DBFOpen() can be called with the name of a .shp or .shx file, and it will figure out the @@ -43,8 +43,8 @@

DBFCreate()

pszDBFFile: The name of the xBase (.dbf) file to create. - - The DBFCreate() function creates a new xBase format file with the given + + The DBFCreate() function creates a new xBase format file with the given name, and returns an access handle that can be used with other DBF functions. The newly created file will have no fields, and no records. Fields should be added with DBFAddField() before any records add written. @@ -54,7 +54,7 @@

DBFCreate()

DBFGetFieldCount()

-int DBFGetFieldCount( DBFHandle hDBF );
+int DBFGetFieldCount( const DBFHandle hDBF );
 
   hDBF:		The access handle for the file to be queried, as returned
                 by DBFOpen(), or DBFCreate().
@@ -68,7 +68,7 @@ 

DBFGetFieldCount()

DBFGetRecordCount()

-int DBFGetRecordCount( DBFHandle hDBF );
+int DBFGetRecordCount( const DBFHandle hDBF );
 
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
@@ -83,7 +83,7 @@ 

DBFGetRecordCount()

DBFGetFieldIndex()

-int DBFGetFieldIndex( DBFHandle hDBF, const char *pszFieldName );
+int DBFGetFieldIndex( const DBFHandle hDBF, const char *pszFieldName );
 
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
@@ -99,25 +99,26 @@ 

DBFGetFieldIndex()

DBFGetFieldInfo()

-DBFFieldType DBFGetFieldInfo( DBFHandle hDBF, int iField, char * pszFieldName,
+DBFFieldType DBFGetFieldInfo( const  DBFHandle hDBF, int iField,
+                              char * pszFieldName,
                               int * pnWidth, int * pnDecimals );
 
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
 
-  iField:	The field to be queried.  This should be a number between 
+  iField:	The field to be queried.  This should be a number between
                 0 and n-1, where n is the number fields on the file, as
                 returned by DBFGetFieldCount().
 
   pszFieldName:	If this pointer is not NULL the name of the requested field
-		will be written to this location.  The pszFieldName buffer 
+		will be written to this location.  The pszFieldName buffer
                 should be at least 12 character is size in order to hold
-		the longest possible field name of 11 characters plus a 
+		the longest possible field name of 11 characters plus a
                 terminating zero character.
 
   pnWidth:	If this pointer is not NULL, the width of the requested field
 		will be returned in the int pointed to by pnWidth.  This is
-                the width in characters.  
+                the width in characters.
 
   pnDecimals:	If this pointer is not NULL, the number of decimal places
                 precision defined for the field will be returned.  This is
@@ -127,16 +128,16 @@ 

DBFGetFieldInfo()

The DBFGetFieldInfo() returns the type of the requested field, which is one of the DBFFieldType enumerated values. As well, the field name, and field width information can optionally be returned. The field type returned - does not correspond one to one with the xBase field types. For instance - the xBase field type for Date will just be returned as being FTInteger.

+ does not correspond one to one with the xBase field types.

     typedef enum {
-      FTString,			/* fixed length string field 		*/
-      FTInteger,		/* numeric field with no decimals 	*/
-      FTDouble,			/* numeric field with decimals 		*/
-      FTLogical,		/* logical field.                       */
-      FTInvalid                 /* not a recognised field type 		*/
+      FTString,			/* fixed length string field        */
+      FTInteger,		/* numeric field with no decimals   */
+      FTDouble,			/* numeric field with decimals      */
+      FTLogical,		/* logical field                    */
+      FTDate,			/* date field                       */
+      FTInvalid			/* not a recognised field type      */
     } DBFFieldType;
 
@@ -145,7 +146,7 @@

DBFGetFieldInfo()

DBFAddField()

-int DBFAddField( DBFHandle hDBF, const char * pszFieldName, 
+int DBFAddField( DBFHandle hDBF, const char * pszFieldName,
                  DBFFieldType eType, int nWidth, int nDecimals );
 
   hDBF:		The access handle for the file to be updated, as returned by
@@ -186,7 +187,7 @@ 

DBFReadIntegerAttribute()

 int DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
-  
+
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
 
@@ -206,7 +207,7 @@ 

DBFReadDoubleAttribute()

 double DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
-  
+
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
 
@@ -226,7 +227,7 @@ 

DBFReadStringAttribute()

 const char *DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
-  
+
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
 
@@ -237,10 +238,10 @@ 

DBFReadStringAttribute()

The DBFReadStringAttribute() will read the value of one field and return - it as a string. This function may be used on any field type (including + it as a string. This function may be used on any field type (including FTInteger and FTDouble) and will return the string representation stored in the .dbf file. The returned pointer is to an internal buffer - which is only valid untill the next DBF function call. It's contents may + which is only valid until the next DBF function call. It's contents may be copied with normal string functions such as strcpy(), or strdup(). If the TRIM_DBF_WHITESPACE macro is defined in shapefil.h (it is by default) then all leading and trailing space (ASCII 32) characters will be stripped @@ -251,8 +252,8 @@

DBFReadStringAttribute()

DBFIsAttributeNULL()

-int DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
-  
+int DBFIsAttributeNULL( const DBFHandle hDBF, int iShape, int iField );
+
   hDBF:		The access handle for the file to be queried, as returned by
 		DBFOpen(), or DBFCreate().
 
@@ -265,7 +266,7 @@ 

DBFIsAttributeNULL()

This function will return TRUE if the indicated field is NULL valued otherwise FALSE. Note that NULL fields are represented in the .dbf file as having all spaces in the field. Reading NULL fields will result in - a value of 0.0 or an empty string with the other DBFRead*Attribute() + a value of 0.0 or an empty string with the other DBFRead*Attribute() functions.

@@ -289,7 +290,7 @@

DBFWriteIntegerAttribute

The DBFWriteIntegerAttribute() function is used to write a value to a numeric field (FTInteger, or FTDouble). If the write succeeds the value TRUE will -be returned, otherwise FALSE will be returned. If the value is too large to +be returned, otherwise FALSE will be returned. If the value is too large to fit in the field, it will be truncated and FALSE returned.

@@ -313,7 +314,7 @@

DBFWriteDoubleAttribute()

The DBFWriteDoubleAttribute() function is used to write a value to a numeric field (FTInteger, or FTDouble). If the write succeeds the value TRUE will -be returned, otherwise FALSE will be returned. If the value is too large to +be returned, otherwise FALSE will be returned. If the value is too large to fit in the field, it will be truncated and FALSE returned.

@@ -336,8 +337,8 @@

DBFWriteStringAttribute()

The DBFWriteStringAttribute() function is used to write a value to a string -field (FString). If the write succeeds the value TRUE willbe returned, -otherwise FALSE will be returned. If the value is too large to +field (FString). If the write succeeds the value TRUE willbe returned, +otherwise FALSE will be returned. If the value is too large to fit in the field, it will be truncated and FALSE returned.

@@ -358,7 +359,7 @@

DBFWriteNULLAttribute()

The DBFWriteNULLAttribute() function is used to clear the indicated field to a NULL value. In the .dbf file this is represented by setting the entire -field to spaces. If the write succeeds the value TRUE willbe returned, +field to spaces. If the write succeeds the value TRUE willbe returned, otherwise FALSE will be returned.

@@ -382,7 +383,7 @@

DBFClose()

DBFIsRecordDeleted()

-int DBFIsRecordDeleted( DBFHandle hDBF, int iShape );
+int DBFIsRecordDeleted( const DBFHandle hDBF, int iShape );
 
   hDBF:		The access handle for the file to be checked.
   iShape:       The record index to check.
@@ -410,11 +411,11 @@ 

DBFMarkRecordDeleted()

DBFGetNativeFieldType()

-char DBFGetNativeFieldType( DBFHandle hDBF, int iField );
+char DBFGetNativeFieldType( const DBFHandle hDBF, int iField );
 
   hDBF:		The access handle for the file.
   iField:       The field index to query.
-  
+
 
This function returns the DBF type code of the indicated field. It will diff --git a/shapelib/dbfopen.c b/shapelib/dbfopen.c index 218db70cf..90ed7ea8e 100644 --- a/shapelib/dbfopen.c +++ b/shapelib/dbfopen.c @@ -1,5 +1,4 @@ /****************************************************************************** - * $Id: dbfopen.c,v 1.94 2018-08-16 15:39:07 erouault Exp $ * * Project: Shapelib * Purpose: Implementation of .dbf access API documented in dbf_api.html. @@ -7,199 +6,16 @@ * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam - * Copyright (c) 2012-2013, Even Rouault + * Copyright (c) 2012-2024, Even Rouault * - * This software is available under the following "MIT Style" license, - * or at the option of the licensee under the LGPL (see COPYING). This - * option is discussed in more detail in shapelib.html. - * - * -- - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - ****************************************************************************** - * - * $Log: dbfopen.c,v $ - * Revision 1.94 2018-08-16 15:39:07 erouault - * * shpopen.c, dbfopen.c, shptree.c, sbnsearch.c: resyc with GDAL - * internal shapelib. Mostly to allow building those files as C++ - * without warning. Also add FTDate entry in DBFFieldType - * (see https://github.com/OSGeo/gdal/pull/308). And some other - * code cleanups - * - * Revision 1.93 2018-08-16 15:24:46 erouault - * * dbfopen.c: fix a bug where the end of file character was - * written on top of the first character of the first field name - * when deleting a field on a .dbf without records. - * Fixes https://github.com/OSGeo/gdal/issues/863 - * - * Revision 1.92 2016-12-05 18:44:08 erouault - * * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. - * This behaviour can be controlled with the DBFSetWriteEndOfFileChar() - * function. - * - * Revision 1.91 2016-12-05 12:44:05 erouault - * * Major overhaul of Makefile build system to use autoconf/automake. - * - * * Warning fixes in contrib/ - * - * Revision 1.90 2016-12-04 15:30:15 erouault - * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with - * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo - * structures extended with new members. New functions: - * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, - * SHPSetFastModeReadObject - * - * * sbnsearch.c: new file to implement original ESRI .sbn spatial - * index reading. (no write support). New functions: - * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, - * SBNSearchDiskTreeInteger, SBNSearchFreeIds - * - * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates - * with new file and symbols. - * - * * commit: helper script to cvs commit - * - * Revision 1.89 2011-07-24 05:59:25 fwarmerdam - * minimize use of CPLError in favor of SAHooks.Error() - * - * Revision 1.88 2011-05-13 17:35:17 fwarmerdam - * added DBFReorderFields() and DBFAlterFields() functions (from Even) - * - * Revision 1.87 2011-05-07 22:41:02 fwarmerdam - * ensure pending record is flushed when adding a native field (GDAL #4073) - * - * Revision 1.86 2011-04-17 15:15:29 fwarmerdam - * Removed unused variable. - * - * Revision 1.85 2010-12-06 16:09:34 fwarmerdam - * fix buffer read overrun fetching code page (bug 2276) - * - * Revision 1.84 2009-10-29 19:59:48 fwarmerdam - * avoid crash on truncated header (gdal #3093) - * - * Revision 1.83 2008/11/12 14:28:15 fwarmerdam - * DBFCreateField() now works on files with records - * - * Revision 1.82 2008/11/11 17:47:09 fwarmerdam - * added DBFDeleteField() function - * - * Revision 1.81 2008/01/03 17:48:13 bram - * in DBFCreate, use default code page LDID/87 (= 0x57, ANSI) - * instead of LDID/3. This seems to be the same as what ESRI - * would be doing by default. - * - * Revision 1.80 2007/12/30 14:36:39 fwarmerdam - * avoid syntax issue with last comment. - * - * Revision 1.79 2007/12/30 14:35:48 fwarmerdam - * Avoid char* / unsigned char* warnings. - * - * Revision 1.78 2007/12/18 18:28:07 bram - * - create hook for client specific atof (bugzilla ticket 1615) - * - check for NULL handle before closing cpCPG file, and close after reading. - * - * Revision 1.77 2007/12/15 20:25:21 bram - * dbfopen.c now reads the Code Page information from the DBF file, and exports - * this information as a string through the DBFGetCodePage function. This is - * either the number from the LDID header field ("LDID/") or as the - * content of an accompanying .CPG file. When creating a DBF file, the code can - * be set using DBFCreateEx. - * - * Revision 1.76 2007/12/12 22:21:32 bram - * DBFClose: check for NULL psDBF handle before trying to close it. - * - * Revision 1.75 2007/12/06 13:58:19 fwarmerdam - * make sure file offset calculations are done in as SAOffset - * - * Revision 1.74 2007/12/06 07:00:25 fwarmerdam - * dbfopen now using SAHooks for fileio - * - * Revision 1.73 2007/09/03 19:48:11 fwarmerdam - * move DBFReadAttribute() static dDoubleField into dbfinfo - * - * Revision 1.72 2007/09/03 19:34:06 fwarmerdam - * Avoid use of static tuple buffer in DBFReadTuple() - * - * Revision 1.71 2006/06/22 14:37:18 fwarmerdam - * avoid memory leak if dbfopen fread fails - * - * Revision 1.70 2006/06/17 17:47:05 fwarmerdam - * use calloc() for dbfinfo in DBFCreate - * - * Revision 1.69 2006/06/17 15:34:32 fwarmerdam - * disallow creating fields wider than 255 - * - * Revision 1.68 2006/06/17 15:12:40 fwarmerdam - * Fixed C++ style comments. - * - * Revision 1.67 2006/06/17 00:24:53 fwarmerdam - * Don't treat non-zero decimals values as high order byte for length - * for strings. It causes serious corruption for some files. - * http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 - * - * Revision 1.66 2006/03/29 18:26:20 fwarmerdam - * fixed bug with size of pachfieldtype in dbfcloneempty - * - * Revision 1.65 2006/02/15 01:14:30 fwarmerdam - * added DBFAddNativeFieldType - * - * Revision 1.64 2006/02/09 00:29:04 fwarmerdam - * Changed to put spaces into string fields that are NULL as - * per http://bugzilla.maptools.org/show_bug.cgi?id=316. - * - * Revision 1.63 2006/01/25 15:35:43 fwarmerdam - * check success on DBFFlushRecord - * - * Revision 1.62 2006/01/10 16:28:03 fwarmerdam - * Fixed typo in CPLError. - * - * Revision 1.61 2006/01/10 16:26:29 fwarmerdam - * Push loading record buffer into DBFLoadRecord. - * Implement CPL error reporting if USE_CPL defined. - * - * Revision 1.60 2006/01/05 01:27:27 fwarmerdam - * added dbf deletion mark/fetch - * - * Revision 1.59 2005/03/14 15:20:28 fwarmerdam - * Fixed last change. - * - * Revision 1.58 2005/03/14 15:18:54 fwarmerdam - * Treat very wide fields with no decimals as double. This is - * more than 32bit integer fields. - * - * Revision 1.57 2005/02/10 20:16:54 fwarmerdam - * Make the pszStringField buffer for DBFReadAttribute() static char [256] - * as per bug 306. - * - * Revision 1.56 2005/02/10 20:07:56 fwarmerdam - * Fixed bug 305 in DBFCloneEmpty() - header length problem. - * - * Revision 1.55 2004/09/26 20:23:46 fwarmerdam - * avoid warnings with rcsid and signed/unsigned stuff - * - * Revision 1.54 2004/09/15 16:26:10 fwarmerdam - * Treat all blank numeric fields as null too. - */ + * SPDX-License-Identifier: MIT OR LGPL-2.0-or-later + ******************************************************************************/ -#include "shapefil.h" +#include "shapefil_private.h" #include +#include +#include #include #include #include @@ -208,76 +24,50 @@ #include "cpl_string.h" #else -#if defined(WIN32) || defined(_WIN32) -# define STRCASECMP(a,b) (stricmp(a,b)) -# else +#if defined(_MSC_VER) +#define STRCASECMP(a, b) (_stricmp(a, b)) +#elif defined(_WIN32) +#define STRCASECMP(a, b) (stricmp(a, b)) +#else #include -# define STRCASECMP(a,b) (strcasecmp(a,b)) +#define STRCASECMP(a, b) (strcasecmp(a, b)) #endif #if defined(_MSC_VER) -# if _MSC_VER < 1900 -# define snprintf _snprintf -# endif -#elif defined(WIN32) || defined(_WIN32) -# ifndef snprintf -# define snprintf _snprintf -# endif +#if _MSC_VER < 1900 +#define snprintf _snprintf +#endif +#elif defined(_WIN32) +#ifndef snprintf +#define snprintf _snprintf +#endif #endif #define CPLsprintf sprintf #define CPLsnprintf snprintf #endif -SHP_CVSID("$Id: dbfopen.c,v 1.94 2018-08-16 15:39:07 erouault Exp $") - #ifndef FALSE -# define FALSE 0 -# define TRUE 1 +#define FALSE 0 +#define TRUE 1 #endif /* File header size */ -#define XBASE_FILEHDR_SZ 32 +#define XBASE_FILEHDR_SZ 32 #define HEADER_RECORD_TERMINATOR 0x0D /* See http://www.manmrk.net/tutorials/database/xbase/dbf.html */ -#define END_OF_FILE_CHARACTER 0x1A +#define END_OF_FILE_CHARACTER 0x1A #ifdef USE_CPL -CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) {} +CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) +{ +} #else #define CPL_IGNORE_RET_VAL_INT(x) x #endif -#ifdef __cplusplus -#define STATIC_CAST(type,x) static_cast(x) -#define REINTERPRET_CAST(type,x) reinterpret_cast(x) -#define CONST_CAST(type,x) const_cast(x) -#define SHPLIB_NULLPTR nullptr -#else -#define STATIC_CAST(type,x) ((type)(x)) -#define REINTERPRET_CAST(type,x) ((type)(x)) -#define CONST_CAST(type,x) ((type)(x)) -#define SHPLIB_NULLPTR NULL -#endif - -/************************************************************************/ -/* SfRealloc() */ -/* */ -/* A realloc cover function that will access a NULL pointer as */ -/* a valid input. */ -/************************************************************************/ - -static void * SfRealloc( void * pMem, int nNewSize ) - -{ - if( pMem == SHPLIB_NULLPTR ) - return malloc(nNewSize); - else - return realloc(pMem,nNewSize); -} - /************************************************************************/ /* DBFWriteHeader() */ /* */ @@ -288,19 +78,18 @@ static void * SfRealloc( void * pMem, int nNewSize ) /************************************************************************/ static void DBFWriteHeader(DBFHandle psDBF) - { - unsigned char abyHeader[XBASE_FILEHDR_SZ] = { 0 }; + unsigned char abyHeader[XBASE_FILEHDR_SZ] = {0}; - if( !psDBF->bNoHeader ) + if (!psDBF->bNoHeader) return; psDBF->bNoHeader = FALSE; -/* -------------------------------------------------------------------- */ -/* Initialize the file header information. */ -/* -------------------------------------------------------------------- */ - abyHeader[0] = 0x03; /* memo field? - just copying */ + /* -------------------------------------------------------------------- */ + /* Initialize the file header information. */ + /* -------------------------------------------------------------------- */ + abyHeader[0] = 0x03; /* memo field? - just copying */ /* write out update date */ abyHeader[1] = STATIC_CAST(unsigned char, psDBF->nUpdateYearSince1900); @@ -317,35 +106,33 @@ static void DBFWriteHeader(DBFHandle psDBF) abyHeader[29] = STATIC_CAST(unsigned char, psDBF->iLanguageDriver); -/* -------------------------------------------------------------------- */ -/* Write the initial 32 byte file header, and all the field */ -/* descriptions. */ -/* -------------------------------------------------------------------- */ - psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); - psDBF->sHooks.FWrite( abyHeader, XBASE_FILEHDR_SZ, 1, psDBF->fp ); - psDBF->sHooks.FWrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, - psDBF->fp ); - -/* -------------------------------------------------------------------- */ -/* Write out the newline character if there is room for it. */ -/* -------------------------------------------------------------------- */ - if( psDBF->nHeaderLength > XBASE_FLDHDR_SZ*psDBF->nFields + - XBASE_FLDHDR_SZ ) + /* -------------------------------------------------------------------- */ + /* Write the initial 32 byte file header, and all the field */ + /* descriptions. */ + /* -------------------------------------------------------------------- */ + psDBF->sHooks.FSeek(psDBF->fp, 0, 0); + psDBF->sHooks.FWrite(abyHeader, XBASE_FILEHDR_SZ, 1, psDBF->fp); + psDBF->sHooks.FWrite(psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, + psDBF->fp); + + /* -------------------------------------------------------------------- */ + /* Write out the newline character if there is room for it. */ + /* -------------------------------------------------------------------- */ + if (psDBF->nHeaderLength > + XBASE_FLDHDR_SZ * psDBF->nFields + XBASE_FLDHDR_SZ) { - char cNewline; - - cNewline = HEADER_RECORD_TERMINATOR; - psDBF->sHooks.FWrite( &cNewline, 1, 1, psDBF->fp ); + char cNewline = HEADER_RECORD_TERMINATOR; + psDBF->sHooks.FWrite(&cNewline, 1, 1, psDBF->fp); } -/* -------------------------------------------------------------------- */ -/* If the file is new, add a EOF character. */ -/* -------------------------------------------------------------------- */ - if( psDBF->nRecords == 0 && psDBF->bWriteEndOfFileChar ) + /* -------------------------------------------------------------------- */ + /* If the file is new, add a EOF character. */ + /* -------------------------------------------------------------------- */ + if (psDBF->nRecords == 0 && psDBF->bWriteEndOfFileChar) { char ch = END_OF_FILE_CHARACTER; - psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + psDBF->sHooks.FWrite(&ch, 1, 1, psDBF->fp); } } @@ -355,125 +142,149 @@ static void DBFWriteHeader(DBFHandle psDBF) /* Write out the current record if there is one. */ /************************************************************************/ -static int DBFFlushRecord( DBFHandle psDBF ) - +static bool DBFFlushRecord(DBFHandle psDBF) { - SAOffset nRecordOffset; - - if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) + if (psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1) { - psDBF->bCurrentRecordModified = FALSE; - - nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset, psDBF->nCurrentRecord) - + psDBF->nHeaderLength; + psDBF->bCurrentRecordModified = FALSE; + + const SAOffset nRecordOffset = + psDBF->nRecordLength * + STATIC_CAST(SAOffset, psDBF->nCurrentRecord) + + psDBF->nHeaderLength; + + /* -------------------------------------------------------------------- */ + /* Guard FSeek with check for whether we're already at position; */ + /* no-op FSeeks defeat network filesystems' write buffering. */ + /* -------------------------------------------------------------------- */ + if (psDBF->bRequireNextWriteSeek || + psDBF->sHooks.FTell(psDBF->fp) != nRecordOffset) + { + if (psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0) != 0) + { + char szMessage[128]; + snprintf( + szMessage, sizeof(szMessage), + "Failure seeking to position before writing DBF record %d.", + psDBF->nCurrentRecord); + psDBF->sHooks.Error(szMessage); + return false; + } + } - if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ) != 0 - || psDBF->sHooks.FWrite( psDBF->pszCurrentRecord, - psDBF->nRecordLength, - 1, psDBF->fp ) != 1 ) + if (psDBF->sHooks.FWrite(psDBF->pszCurrentRecord, psDBF->nRecordLength, + 1, psDBF->fp) != 1) { char szMessage[128]; - snprintf( szMessage, sizeof(szMessage), "Failure writing DBF record %d.", - psDBF->nCurrentRecord ); - psDBF->sHooks.Error( szMessage ); - return FALSE; + snprintf(szMessage, sizeof(szMessage), + "Failure writing DBF record %d.", psDBF->nCurrentRecord); + psDBF->sHooks.Error(szMessage); + return false; } - if( psDBF->nCurrentRecord == psDBF->nRecords - 1 ) + /* -------------------------------------------------------------------- */ + /* If next op is also a write, allow possible skipping of FSeek. */ + /* -------------------------------------------------------------------- */ + psDBF->bRequireNextWriteSeek = FALSE; + + if (psDBF->nCurrentRecord == psDBF->nRecords - 1) { - if( psDBF->bWriteEndOfFileChar ) + if (psDBF->bWriteEndOfFileChar) { char ch = END_OF_FILE_CHARACTER; - psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + psDBF->sHooks.FWrite(&ch, 1, 1, psDBF->fp); } } } - return TRUE; + return true; } /************************************************************************/ /* DBFLoadRecord() */ /************************************************************************/ -static int DBFLoadRecord( DBFHandle psDBF, int iRecord ) - +static bool DBFLoadRecord(DBFHandle psDBF, int iRecord) { - if( psDBF->nCurrentRecord != iRecord ) + if (psDBF->nCurrentRecord != iRecord) { - SAOffset nRecordOffset; + if (!DBFFlushRecord(psDBF)) + return false; - if( !DBFFlushRecord( psDBF ) ) - return FALSE; + const SAOffset nRecordOffset = + psDBF->nRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; - nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; - - if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, SEEK_SET ) != 0 ) + if (psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, SEEK_SET) != 0) { char szMessage[128]; - snprintf( szMessage, sizeof(szMessage), "fseek(%ld) failed on DBF file.", - STATIC_CAST(long, nRecordOffset) ); - psDBF->sHooks.Error( szMessage ); - return FALSE; + snprintf(szMessage, sizeof(szMessage), + "fseek(%ld) failed on DBF file.", + STATIC_CAST(long, nRecordOffset)); + psDBF->sHooks.Error(szMessage); + return false; } - if( psDBF->sHooks.FRead( psDBF->pszCurrentRecord, - psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) + if (psDBF->sHooks.FRead(psDBF->pszCurrentRecord, psDBF->nRecordLength, + 1, psDBF->fp) != 1) { char szMessage[128]; - snprintf( szMessage, sizeof(szMessage), "fread(%d) failed on DBF file.", - psDBF->nRecordLength ); - psDBF->sHooks.Error( szMessage ); - return FALSE; + snprintf(szMessage, sizeof(szMessage), + "fread(%d) failed on DBF file.", psDBF->nRecordLength); + psDBF->sHooks.Error(szMessage); + return false; } - psDBF->nCurrentRecord = iRecord; + psDBF->nCurrentRecord = iRecord; + /* -------------------------------------------------------------------- */ + /* Require a seek for next write in case of mixed R/W operations. */ + /* -------------------------------------------------------------------- */ + psDBF->bRequireNextWriteSeek = TRUE; } - return TRUE; + return true; } /************************************************************************/ /* DBFUpdateHeader() */ /************************************************************************/ -void SHPAPI_CALL -DBFUpdateHeader( DBFHandle psDBF ) - +void SHPAPI_CALL DBFUpdateHeader(DBFHandle psDBF) { - unsigned char abyFileHeader[XBASE_FILEHDR_SZ]; - - if( psDBF->bNoHeader ) - DBFWriteHeader( psDBF ); + if (psDBF->bNoHeader) + DBFWriteHeader(psDBF); - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return; - psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); - psDBF->sHooks.FRead( abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, 0, 0); + + unsigned char abyFileHeader[XBASE_FILEHDR_SZ] = {0}; + psDBF->sHooks.FRead(abyFileHeader, 1, sizeof(abyFileHeader), psDBF->fp); abyFileHeader[1] = STATIC_CAST(unsigned char, psDBF->nUpdateYearSince1900); abyFileHeader[2] = STATIC_CAST(unsigned char, psDBF->nUpdateMonth); abyFileHeader[3] = STATIC_CAST(unsigned char, psDBF->nUpdateDay); abyFileHeader[4] = STATIC_CAST(unsigned char, psDBF->nRecords & 0xFF); - abyFileHeader[5] = STATIC_CAST(unsigned char, (psDBF->nRecords>>8) & 0xFF); - abyFileHeader[6] = STATIC_CAST(unsigned char, (psDBF->nRecords>>16) & 0xFF); - abyFileHeader[7] = STATIC_CAST(unsigned char, (psDBF->nRecords>>24) & 0xFF); + abyFileHeader[5] = + STATIC_CAST(unsigned char, (psDBF->nRecords >> 8) & 0xFF); + abyFileHeader[6] = + STATIC_CAST(unsigned char, (psDBF->nRecords >> 16) & 0xFF); + abyFileHeader[7] = + STATIC_CAST(unsigned char, (psDBF->nRecords >> 24) & 0xFF); - psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); - psDBF->sHooks.FWrite( abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, 0, 0); + psDBF->sHooks.FWrite(abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp); - psDBF->sHooks.FFlush( psDBF->fp ); + psDBF->sHooks.FFlush(psDBF->fp); } /************************************************************************/ /* DBFSetLastModifiedDate() */ /************************************************************************/ -void SHPAPI_CALL -DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ) +void SHPAPI_CALL DBFSetLastModifiedDate(DBFHandle psDBF, int nYYSince1900, + int nMM, int nDD) { psDBF->nUpdateYearSince1900 = nYYSince1900; psDBF->nUpdateMonth = nMM; @@ -486,30 +297,26 @@ DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ) /* Open a .dbf file. */ /************************************************************************/ -DBFHandle SHPAPI_CALL -DBFOpen( const char * pszFilename, const char * pszAccess ) - +DBFHandle SHPAPI_CALL DBFOpen(const char *pszFilename, const char *pszAccess) { SAHooks sHooks; - SASetupDefaultHooks( &sHooks ); + SASetupDefaultHooks(&sHooks); - return DBFOpenLL( pszFilename, pszAccess, &sHooks ); + return DBFOpenLL(pszFilename, pszAccess, &sHooks); } /************************************************************************/ /* DBFGetLenWithoutExtension() */ /************************************************************************/ -static int DBFGetLenWithoutExtension(const char* pszBasename) +static int DBFGetLenWithoutExtension(const char *pszBasename) { - int i; - int nLen = STATIC_CAST(int, strlen(pszBasename)); - for( i = nLen-1; - i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; - i-- ) + const int nLen = STATIC_CAST(int, strlen(pszBasename)); + for (int i = nLen - 1; + i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { - if( pszBasename[i] == '.' ) + if (pszBasename[i] == '.') { return i; } @@ -523,65 +330,58 @@ static int DBFGetLenWithoutExtension(const char* pszBasename) /* Open a .dbf file. */ /************************************************************************/ -DBFHandle SHPAPI_CALL -DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) - +DBFHandle SHPAPI_CALL DBFOpenLL(const char *pszFilename, const char *pszAccess, + const SAHooks *psHooks) { - DBFHandle psDBF; - SAFile pfCPG; - unsigned char *pabyBuf; - int nFields, nHeadLen, iField; - char *pszFullname; - int nBufSize = 500; - int nLenWithoutExtension; - -/* -------------------------------------------------------------------- */ -/* We only allow the access strings "rb" and "r+". */ -/* -------------------------------------------------------------------- */ - if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 - && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 - && strcmp(pszAccess,"r+b") != 0 ) + /* -------------------------------------------------------------------- */ + /* We only allow the access strings "rb" and "r+". */ + /* -------------------------------------------------------------------- */ + if (strcmp(pszAccess, "r") != 0 && strcmp(pszAccess, "r+") != 0 && + strcmp(pszAccess, "rb") != 0 && strcmp(pszAccess, "rb+") != 0 && + strcmp(pszAccess, "r+b") != 0) return SHPLIB_NULLPTR; - if( strcmp(pszAccess,"r") == 0 ) + if (strcmp(pszAccess, "r") == 0) pszAccess = "rb"; - if( strcmp(pszAccess,"r+") == 0 ) + if (strcmp(pszAccess, "r+") == 0) pszAccess = "rb+"; -/* -------------------------------------------------------------------- */ -/* Compute the base (layer) name. If there is any extension */ -/* on the passed in filename we will strip it off. */ -/* -------------------------------------------------------------------- */ - nLenWithoutExtension = DBFGetLenWithoutExtension(pszFilename); - pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); + /* -------------------------------------------------------------------- */ + /* Compute the base (layer) name. If there is any extension */ + /* on the passed in filename we will strip it off. */ + /* -------------------------------------------------------------------- */ + const int nLenWithoutExtension = DBFGetLenWithoutExtension(pszFilename); + char *pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); memcpy(pszFullname, pszFilename, nLenWithoutExtension); memcpy(pszFullname + nLenWithoutExtension, ".dbf", 5); - psDBF = STATIC_CAST(DBFHandle, calloc( 1, sizeof(DBFInfo) )); - psDBF->fp = psHooks->FOpen( pszFullname, pszAccess ); - memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + DBFHandle psDBF = STATIC_CAST(DBFHandle, calloc(1, sizeof(DBFInfo))); + psDBF->fp = psHooks->FOpen(pszFullname, pszAccess, psHooks->pvUserData); + memcpy(&(psDBF->sHooks), psHooks, sizeof(SAHooks)); - if( psDBF->fp == SHPLIB_NULLPTR ) + if (psDBF->fp == SHPLIB_NULLPTR) { memcpy(pszFullname + nLenWithoutExtension, ".DBF", 5); - psDBF->fp = psDBF->sHooks.FOpen(pszFullname, pszAccess ); + psDBF->fp = + psDBF->sHooks.FOpen(pszFullname, pszAccess, psHooks->pvUserData); } memcpy(pszFullname + nLenWithoutExtension, ".cpg", 5); - pfCPG = psHooks->FOpen( pszFullname, "r" ); - if( pfCPG == SHPLIB_NULLPTR ) + SAFile pfCPG = psHooks->FOpen(pszFullname, "r", psHooks->pvUserData); + if (pfCPG == SHPLIB_NULLPTR) { memcpy(pszFullname + nLenWithoutExtension, ".CPG", 5); - pfCPG = psHooks->FOpen( pszFullname, "r" ); + pfCPG = psHooks->FOpen(pszFullname, "r", psHooks->pvUserData); } - free( pszFullname ); + free(pszFullname); - if( psDBF->fp == SHPLIB_NULLPTR ) + if (psDBF->fp == SHPLIB_NULLPTR) { - free( psDBF ); - if( pfCPG ) psHooks->FClose( pfCPG ); + free(psDBF); + if (pfCPG) + psHooks->FClose(pfCPG); return SHPLIB_NULLPTR; } @@ -589,84 +389,88 @@ DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; -/* -------------------------------------------------------------------- */ -/* Read Table Header info */ -/* -------------------------------------------------------------------- */ - pabyBuf = STATIC_CAST(unsigned char *, malloc(nBufSize)); - if( psDBF->sHooks.FRead( pabyBuf, XBASE_FILEHDR_SZ, 1, psDBF->fp ) != 1 ) + /* -------------------------------------------------------------------- */ + /* Read Table Header info */ + /* -------------------------------------------------------------------- */ + const int nBufSize = 500; + unsigned char *pabyBuf = STATIC_CAST(unsigned char *, malloc(nBufSize)); + if (psDBF->sHooks.FRead(pabyBuf, XBASE_FILEHDR_SZ, 1, psDBF->fp) != 1) { - psDBF->sHooks.FClose( psDBF->fp ); - if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); - free( pabyBuf ); - free( psDBF ); + psDBF->sHooks.FClose(psDBF->fp); + if (pfCPG) + psDBF->sHooks.FClose(pfCPG); + free(pabyBuf); + free(psDBF); return SHPLIB_NULLPTR; } DBFSetLastModifiedDate(psDBF, pabyBuf[1], pabyBuf[2], pabyBuf[3]); - psDBF->nRecords = - pabyBuf[4]|(pabyBuf[5]<<8)|(pabyBuf[6]<<16)|((pabyBuf[7]&0x7f)<<24); + psDBF->nRecords = pabyBuf[4] | (pabyBuf[5] << 8) | (pabyBuf[6] << 16) | + ((pabyBuf[7] & 0x7f) << 24); - psDBF->nHeaderLength = nHeadLen = pabyBuf[8]|(pabyBuf[9]<<8); - psDBF->nRecordLength = pabyBuf[10]|(pabyBuf[11]<<8); + const int nHeadLen = pabyBuf[8] | (pabyBuf[9] << 8); + psDBF->nHeaderLength = nHeadLen; + psDBF->nRecordLength = pabyBuf[10] | (pabyBuf[11] << 8); psDBF->iLanguageDriver = pabyBuf[29]; if (psDBF->nRecordLength == 0 || nHeadLen < XBASE_FILEHDR_SZ) { - psDBF->sHooks.FClose( psDBF->fp ); - if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); - free( pabyBuf ); - free( psDBF ); + psDBF->sHooks.FClose(psDBF->fp); + if (pfCPG) + psDBF->sHooks.FClose(pfCPG); + free(pabyBuf); + free(psDBF); return SHPLIB_NULLPTR; } - psDBF->nFields = nFields = (nHeadLen - XBASE_FILEHDR_SZ) / XBASE_FLDHDR_SZ; + const int nFields = (nHeadLen - XBASE_FILEHDR_SZ) / XBASE_FLDHDR_SZ; + psDBF->nFields = nFields; /* coverity[tainted_data] */ psDBF->pszCurrentRecord = STATIC_CAST(char *, malloc(psDBF->nRecordLength)); -/* -------------------------------------------------------------------- */ -/* Figure out the code page from the LDID and CPG */ -/* -------------------------------------------------------------------- */ - + /* -------------------------------------------------------------------- */ + /* Figure out the code page from the LDID and CPG */ + /* -------------------------------------------------------------------- */ psDBF->pszCodePage = SHPLIB_NULLPTR; - if( pfCPG ) + if (pfCPG) { - size_t n; - memset( pabyBuf, 0, nBufSize); - psDBF->sHooks.FRead( pabyBuf, nBufSize - 1, 1, pfCPG ); - n = strcspn( REINTERPRET_CAST(char *, pabyBuf), "\n\r" ); - if( n > 0 ) + memset(pabyBuf, 0, nBufSize); + psDBF->sHooks.FRead(pabyBuf, 1, nBufSize - 1, pfCPG); + const size_t n = strcspn(REINTERPRET_CAST(char *, pabyBuf), "\n\r"); + if (n > 0) { pabyBuf[n] = '\0'; psDBF->pszCodePage = STATIC_CAST(char *, malloc(n + 1)); - memcpy( psDBF->pszCodePage, pabyBuf, n + 1 ); + memcpy(psDBF->pszCodePage, pabyBuf, n + 1); } - psDBF->sHooks.FClose( pfCPG ); + psDBF->sHooks.FClose(pfCPG); } - if( psDBF->pszCodePage == SHPLIB_NULLPTR && pabyBuf[29] != 0 ) + if (psDBF->pszCodePage == SHPLIB_NULLPTR && pabyBuf[29] != 0) { - snprintf( REINTERPRET_CAST(char *, pabyBuf), nBufSize, "LDID/%d", psDBF->iLanguageDriver ); - psDBF->pszCodePage = STATIC_CAST(char *, malloc(strlen(REINTERPRET_CAST(char*, pabyBuf)) + 1)); - strcpy( psDBF->pszCodePage, REINTERPRET_CAST(char *, pabyBuf) ); + snprintf(REINTERPRET_CAST(char *, pabyBuf), nBufSize, "LDID/%d", + psDBF->iLanguageDriver); + psDBF->pszCodePage = STATIC_CAST( + char *, malloc(strlen(REINTERPRET_CAST(char *, pabyBuf)) + 1)); + strcpy(psDBF->pszCodePage, REINTERPRET_CAST(char *, pabyBuf)); } -/* -------------------------------------------------------------------- */ -/* Read in Field Definitions */ -/* -------------------------------------------------------------------- */ - - pabyBuf = STATIC_CAST(unsigned char *, SfRealloc(pabyBuf,nHeadLen)); + /* -------------------------------------------------------------------- */ + /* Read in Field Definitions */ + /* -------------------------------------------------------------------- */ + pabyBuf = STATIC_CAST(unsigned char *, realloc(pabyBuf, nHeadLen)); psDBF->pszHeader = REINTERPRET_CAST(char *, pabyBuf); - psDBF->sHooks.FSeek( psDBF->fp, XBASE_FILEHDR_SZ, 0 ); - if( psDBF->sHooks.FRead( pabyBuf, nHeadLen-XBASE_FILEHDR_SZ, 1, - psDBF->fp ) != 1 ) + psDBF->sHooks.FSeek(psDBF->fp, XBASE_FILEHDR_SZ, 0); + if (psDBF->sHooks.FRead(pabyBuf, nHeadLen - XBASE_FILEHDR_SZ, 1, + psDBF->fp) != 1) { - psDBF->sHooks.FClose( psDBF->fp ); - free( pabyBuf ); - free( psDBF->pszCurrentRecord ); - free( psDBF->pszCodePage ); - free( psDBF ); + psDBF->sHooks.FClose(psDBF->fp); + free(pabyBuf); + free(psDBF->pszCurrentRecord); + free(psDBF->pszCodePage); + free(psDBF); return SHPLIB_NULLPTR; } @@ -675,105 +479,107 @@ DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) psDBF->panFieldDecimals = STATIC_CAST(int *, malloc(sizeof(int) * nFields)); psDBF->pachFieldType = STATIC_CAST(char *, malloc(sizeof(char) * nFields)); - for( iField = 0; iField < nFields; iField++ ) + for (int iField = 0; iField < nFields; iField++) { - unsigned char *pabyFInfo; - - pabyFInfo = pabyBuf+iField*XBASE_FLDHDR_SZ; - if( pabyFInfo[0] == HEADER_RECORD_TERMINATOR ) + const unsigned char *pabyFInfo = pabyBuf + iField * XBASE_FLDHDR_SZ; + if (pabyFInfo[0] == HEADER_RECORD_TERMINATOR) { psDBF->nFields = iField; break; } - if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) - { - psDBF->panFieldSize[iField] = pabyFInfo[16]; - psDBF->panFieldDecimals[iField] = pabyFInfo[17]; - } - else - { - psDBF->panFieldSize[iField] = pabyFInfo[16]; - psDBF->panFieldDecimals[iField] = 0; - -/* -** The following seemed to be used sometimes to handle files with long -** string fields, but in other cases (such as bug 1202) the decimals field -** just seems to indicate some sort of preferred formatting, not very -** wide fields. So I have disabled this code. FrankW. - psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; - psDBF->panFieldDecimals[iField] = 0; -*/ - } - - psDBF->pachFieldType[iField] = STATIC_CAST(char, pabyFInfo[11]); - if( iField == 0 ) - psDBF->panFieldOffset[iField] = 1; - else - psDBF->panFieldOffset[iField] = - psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; + if (pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F') + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = pabyFInfo[17]; + } + else + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = 0; + + /* + ** The following seemed to be used sometimes to handle files with + long + ** string fields, but in other cases (such as bug 1202) the decimals + field + ** just seems to indicate some sort of preferred formatting, not + very + ** wide fields. So I have disabled this code. FrankW. + psDBF->panFieldSize[iField] = pabyFInfo[16] + + pabyFInfo[17]*256; psDBF->panFieldDecimals[iField] = 0; + */ + } + + psDBF->pachFieldType[iField] = STATIC_CAST(char, pabyFInfo[11]); + if (iField == 0) + psDBF->panFieldOffset[iField] = 1; + else + psDBF->panFieldOffset[iField] = psDBF->panFieldOffset[iField - 1] + + psDBF->panFieldSize[iField - 1]; } /* Check that the total width of fields does not exceed the record width */ - if( psDBF->nFields > 0 && - psDBF->panFieldOffset[psDBF->nFields-1] + - psDBF->panFieldSize[psDBF->nFields-1] > psDBF->nRecordLength ) + if (psDBF->nFields > 0 && psDBF->panFieldOffset[psDBF->nFields - 1] + + psDBF->panFieldSize[psDBF->nFields - 1] > + psDBF->nRecordLength) { - DBFClose( psDBF ); + DBFClose(psDBF); return SHPLIB_NULLPTR; } - DBFSetWriteEndOfFileChar( psDBF, TRUE ); + DBFSetWriteEndOfFileChar(psDBF, TRUE); + + psDBF->bRequireNextWriteSeek = TRUE; - return( psDBF ); + return (psDBF); } /************************************************************************/ /* DBFClose() */ /************************************************************************/ -void SHPAPI_CALL -DBFClose(DBFHandle psDBF) +void SHPAPI_CALL DBFClose(DBFHandle psDBF) { - if( psDBF == SHPLIB_NULLPTR ) + if (psDBF == SHPLIB_NULLPTR) return; -/* -------------------------------------------------------------------- */ -/* Write out header if not already written. */ -/* -------------------------------------------------------------------- */ - if( psDBF->bNoHeader ) - DBFWriteHeader( psDBF ); + /* -------------------------------------------------------------------- */ + /* Write out header if not already written. */ + /* -------------------------------------------------------------------- */ + if (psDBF->bNoHeader) + DBFWriteHeader(psDBF); - CPL_IGNORE_RET_VAL_INT(DBFFlushRecord( psDBF )); + CPL_IGNORE_RET_VAL_INT(DBFFlushRecord(psDBF)); -/* -------------------------------------------------------------------- */ -/* Update last access date, and number of records if we have */ -/* write access. */ -/* -------------------------------------------------------------------- */ - if( psDBF->bUpdated ) - DBFUpdateHeader( psDBF ); + /* -------------------------------------------------------------------- */ + /* Update last access date, and number of records if we have */ + /* write access. */ + /* -------------------------------------------------------------------- */ + if (psDBF->bUpdated) + DBFUpdateHeader(psDBF); -/* -------------------------------------------------------------------- */ -/* Close, and free resources. */ -/* -------------------------------------------------------------------- */ - psDBF->sHooks.FClose( psDBF->fp ); + /* -------------------------------------------------------------------- */ + /* Close, and free resources. */ + /* -------------------------------------------------------------------- */ + psDBF->sHooks.FClose(psDBF->fp); - if( psDBF->panFieldOffset != SHPLIB_NULLPTR ) + if (psDBF->panFieldOffset != SHPLIB_NULLPTR) { - free( psDBF->panFieldOffset ); - free( psDBF->panFieldSize ); - free( psDBF->panFieldDecimals ); - free( psDBF->pachFieldType ); + free(psDBF->panFieldOffset); + free(psDBF->panFieldSize); + free(psDBF->panFieldDecimals); + free(psDBF->pachFieldType); } - if( psDBF->pszWorkField != SHPLIB_NULLPTR ) - free( psDBF->pszWorkField ); + if (psDBF->pszWorkField != SHPLIB_NULLPTR) + free(psDBF->pszWorkField); - free( psDBF->pszHeader ); - free( psDBF->pszCurrentRecord ); - free( psDBF->pszCodePage ); + free(psDBF->pszHeader); + free(psDBF->pszCurrentRecord); + free(psDBF->pszCodePage); - free( psDBF ); + free(psDBF); } /************************************************************************/ @@ -782,11 +588,9 @@ DBFClose(DBFHandle psDBF) /* Create a new .dbf file with default code page LDID/87 (0x57) */ /************************************************************************/ -DBFHandle SHPAPI_CALL -DBFCreate( const char * pszFilename ) - +DBFHandle SHPAPI_CALL DBFCreate(const char *pszFilename) { - return DBFCreateEx( pszFilename, "LDID/87" ); // 0x57 + return DBFCreateEx(pszFilename, "LDID/87"); // 0x57 } /************************************************************************/ @@ -795,15 +599,14 @@ DBFCreate( const char * pszFilename ) /* Create a new .dbf file. */ /************************************************************************/ -DBFHandle SHPAPI_CALL -DBFCreateEx( const char * pszFilename, const char* pszCodePage ) - +DBFHandle SHPAPI_CALL DBFCreateEx(const char *pszFilename, + const char *pszCodePage) { SAHooks sHooks; - SASetupDefaultHooks( &sHooks ); + SASetupDefaultHooks(&sHooks); - return DBFCreateLL( pszFilename, pszCodePage , &sHooks ); + return DBFCreateLL(pszFilename, pszCodePage, &sHooks); } /************************************************************************/ @@ -812,80 +615,69 @@ DBFCreateEx( const char * pszFilename, const char* pszCodePage ) /* Create a new .dbf file. */ /************************************************************************/ -DBFHandle SHPAPI_CALL -DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHooks ) - +DBFHandle SHPAPI_CALL DBFCreateLL(const char *pszFilename, + const char *pszCodePage, + const SAHooks *psHooks) { - DBFHandle psDBF; - SAFile fp; - char *pszFullname; - int ldid = -1; - char chZero = '\0'; - int nLenWithoutExtension; - -/* -------------------------------------------------------------------- */ -/* Compute the base (layer) name. If there is any extension */ -/* on the passed in filename we will strip it off. */ -/* -------------------------------------------------------------------- */ - nLenWithoutExtension = DBFGetLenWithoutExtension(pszFilename); - pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); + /* -------------------------------------------------------------------- */ + /* Compute the base (layer) name. If there is any extension */ + /* on the passed in filename we will strip it off. */ + /* -------------------------------------------------------------------- */ + const int nLenWithoutExtension = DBFGetLenWithoutExtension(pszFilename); + char *pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); memcpy(pszFullname, pszFilename, nLenWithoutExtension); memcpy(pszFullname + nLenWithoutExtension, ".dbf", 5); -/* -------------------------------------------------------------------- */ -/* Create the file. */ -/* -------------------------------------------------------------------- */ - fp = psHooks->FOpen( pszFullname, "wb" ); - if( fp == SHPLIB_NULLPTR ) - { - free( pszFullname ); - return SHPLIB_NULLPTR; - } - - psHooks->FWrite( &chZero, 1, 1, fp ); - psHooks->FClose( fp ); - - fp = psHooks->FOpen( pszFullname, "rb+" ); - if( fp == SHPLIB_NULLPTR ) + /* -------------------------------------------------------------------- */ + /* Create the file. */ + /* -------------------------------------------------------------------- */ + SAFile fp = psHooks->FOpen(pszFullname, "wb+", psHooks->pvUserData); + if (fp == SHPLIB_NULLPTR) { - free( pszFullname ); + free(pszFullname); return SHPLIB_NULLPTR; } memcpy(pszFullname + nLenWithoutExtension, ".cpg", 5); - if( pszCodePage != SHPLIB_NULLPTR ) + int ldid = -1; + if (pszCodePage != SHPLIB_NULLPTR) { - if( strncmp( pszCodePage, "LDID/", 5 ) == 0 ) + if (strncmp(pszCodePage, "LDID/", 5) == 0) { - ldid = atoi( pszCodePage + 5 ); - if( ldid > 255 ) - ldid = -1; // don't use 0 to indicate out of range as LDID/0 is a valid one + ldid = atoi(pszCodePage + 5); + if (ldid > 255) + ldid = -1; // don't use 0 to indicate out of range as LDID/0 is + // a valid one } - if( ldid < 0 ) + if (ldid < 0) { - SAFile fpCPG = psHooks->FOpen( pszFullname, "w" ); - psHooks->FWrite( CONST_CAST(void*, STATIC_CAST(const void*, pszCodePage)), strlen(pszCodePage), 1, fpCPG ); - psHooks->FClose( fpCPG ); + SAFile fpCPG = + psHooks->FOpen(pszFullname, "w", psHooks->pvUserData); + psHooks->FWrite( + CONST_CAST(void *, STATIC_CAST(const void *, pszCodePage)), + strlen(pszCodePage), 1, fpCPG); + psHooks->FClose(fpCPG); } } - if( pszCodePage == SHPLIB_NULLPTR || ldid >= 0 ) + if (pszCodePage == SHPLIB_NULLPTR || ldid >= 0) { - psHooks->Remove( pszFullname ); + psHooks->Remove(pszFullname, psHooks->pvUserData); } - free( pszFullname ); + free(pszFullname); -/* -------------------------------------------------------------------- */ -/* Create the info structure. */ -/* -------------------------------------------------------------------- */ - psDBF = STATIC_CAST(DBFHandle, calloc(1,sizeof(DBFInfo))); + /* -------------------------------------------------------------------- */ + /* Create the info structure. */ + /* -------------------------------------------------------------------- */ + DBFHandle psDBF = STATIC_CAST(DBFHandle, calloc(1, sizeof(DBFInfo))); - memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + memcpy(&(psDBF->sHooks), psHooks, sizeof(SAHooks)); psDBF->fp = fp; psDBF->nRecords = 0; psDBF->nFields = 0; psDBF->nRecordLength = 1; - psDBF->nHeaderLength = XBASE_FILEHDR_SZ + 1; /* + 1 for HEADER_RECORD_TERMINATOR */ + psDBF->nHeaderLength = + XBASE_FILEHDR_SZ + 1; /* + 1 for HEADER_RECORD_TERMINATOR */ psDBF->panFieldOffset = SHPLIB_NULLPTR; psDBF->panFieldSize = SHPLIB_NULLPTR; @@ -901,16 +693,19 @@ DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHook psDBF->iLanguageDriver = ldid > 0 ? ldid : 0; psDBF->pszCodePage = SHPLIB_NULLPTR; - if( pszCodePage ) + if (pszCodePage) { - psDBF->pszCodePage = STATIC_CAST(char *, malloc( strlen(pszCodePage) + 1 )); - strcpy( psDBF->pszCodePage, pszCodePage ); + psDBF->pszCodePage = + STATIC_CAST(char *, malloc(strlen(pszCodePage) + 1)); + strcpy(psDBF->pszCodePage, pszCodePage); } DBFSetLastModifiedDate(psDBF, 95, 7, 26); /* dummy date */ DBFSetWriteEndOfFileChar(psDBF, TRUE); - return( psDBF ); + psDBF->bRequireNextWriteSeek = TRUE; + + return (psDBF); } /************************************************************************/ @@ -919,24 +714,22 @@ DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHook /* Add a field to a newly created .dbf or to an existing one */ /************************************************************************/ -int SHPAPI_CALL -DBFAddField(DBFHandle psDBF, const char * pszFieldName, - DBFFieldType eType, int nWidth, int nDecimals ) - +int SHPAPI_CALL DBFAddField(DBFHandle psDBF, const char *pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals) { - char chNativeType = 'C'; + char chNativeType; - if( eType == FTLogical ) + if (eType == FTLogical) chNativeType = 'L'; - else if( eType == FTDate ) - chNativeType = 'D'; - else if( eType == FTString ) + else if (eType == FTDate) + chNativeType = 'D'; + else if (eType == FTString) chNativeType = 'C'; else chNativeType = 'N'; - return DBFAddNativeFieldType( psDBF, pszFieldName, chNativeType, - nWidth, nDecimals ); + return DBFAddNativeFieldType(psDBF, pszFieldName, chNativeType, nWidth, + nDecimals); } /************************************************************************/ @@ -947,15 +740,15 @@ static char DBFGetNullCharacter(char chType) { switch (chType) { - case 'N': - case 'F': - return '*'; - case 'D': - return '0'; - case 'L': - return '?'; - default: - return ' '; + case 'N': + case 'F': + return '*'; + case 'D': + return '0'; + case 'L': + return '?'; + default: + return ' '; } } @@ -966,102 +759,93 @@ static char DBFGetNullCharacter(char chType) /* are written. */ /************************************************************************/ -int SHPAPI_CALL -DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, - char chType, int nWidth, int nDecimals ) - +int SHPAPI_CALL DBFAddNativeFieldType(DBFHandle psDBF, const char *pszFieldName, + char chType, int nWidth, int nDecimals) { - char *pszFInfo; - int i; - int nOldRecordLength, nOldHeaderLength; - char *pszRecord; - char chFieldFill; - SAOffset nRecordOffset; - /* make sure that everything is written in .dbf */ - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return -1; - if( psDBF->nHeaderLength + XBASE_FLDHDR_SZ > 65535 ) + if (psDBF->nHeaderLength + XBASE_FLDHDR_SZ > 65535) { char szMessage[128]; - snprintf( szMessage, sizeof(szMessage), - "Cannot add field %s. Header length limit reached " - "(max 65535 bytes, 2046 fields).", - pszFieldName ); - psDBF->sHooks.Error( szMessage ); + snprintf(szMessage, sizeof(szMessage), + "Cannot add field %s. Header length limit reached " + "(max 65535 bytes, 2046 fields).", + pszFieldName); + psDBF->sHooks.Error(szMessage); return -1; } -/* -------------------------------------------------------------------- */ -/* Do some checking to ensure we can add records to this file. */ -/* -------------------------------------------------------------------- */ - if( nWidth < 1 ) + /* -------------------------------------------------------------------- */ + /* Do some checking to ensure we can add records to this file. */ + /* -------------------------------------------------------------------- */ + if (nWidth < 1) return -1; - if( nWidth > XBASE_FLD_MAX_WIDTH ) + if (nWidth > XBASE_FLD_MAX_WIDTH) nWidth = XBASE_FLD_MAX_WIDTH; - if( psDBF->nRecordLength + nWidth > 65535 ) + if (psDBF->nRecordLength + nWidth > 65535) { char szMessage[128]; - snprintf( szMessage, sizeof(szMessage), - "Cannot add field %s. Record length limit reached " - "(max 65535 bytes).", - pszFieldName ); - psDBF->sHooks.Error( szMessage ); + snprintf(szMessage, sizeof(szMessage), + "Cannot add field %s. Record length limit reached " + "(max 65535 bytes).", + pszFieldName); + psDBF->sHooks.Error(szMessage); return -1; } - nOldRecordLength = psDBF->nRecordLength; - nOldHeaderLength = psDBF->nHeaderLength; + const int nOldRecordLength = psDBF->nRecordLength; + const int nOldHeaderLength = psDBF->nHeaderLength; -/* -------------------------------------------------------------------- */ -/* SfRealloc all the arrays larger to hold the additional field */ -/* information. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* realloc all the arrays larger to hold the additional field */ + /* information. */ + /* -------------------------------------------------------------------- */ psDBF->nFields++; - psDBF->panFieldOffset = STATIC_CAST(int *, - SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields )); + psDBF->panFieldOffset = STATIC_CAST( + int *, realloc(psDBF->panFieldOffset, sizeof(int) * psDBF->nFields)); - psDBF->panFieldSize = STATIC_CAST(int *, - SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields )); + psDBF->panFieldSize = STATIC_CAST( + int *, realloc(psDBF->panFieldSize, sizeof(int) * psDBF->nFields)); - psDBF->panFieldDecimals = STATIC_CAST(int *, - SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields )); + psDBF->panFieldDecimals = STATIC_CAST( + int *, realloc(psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields)); - psDBF->pachFieldType = STATIC_CAST(char *, - SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields )); + psDBF->pachFieldType = STATIC_CAST( + char *, realloc(psDBF->pachFieldType, sizeof(char) * psDBF->nFields)); -/* -------------------------------------------------------------------- */ -/* Assign the new field information fields. */ -/* -------------------------------------------------------------------- */ - psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; + /* -------------------------------------------------------------------- */ + /* Assign the new field information fields. */ + /* -------------------------------------------------------------------- */ + psDBF->panFieldOffset[psDBF->nFields - 1] = psDBF->nRecordLength; psDBF->nRecordLength += nWidth; - psDBF->panFieldSize[psDBF->nFields-1] = nWidth; - psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; - psDBF->pachFieldType[psDBF->nFields-1] = chType; + psDBF->panFieldSize[psDBF->nFields - 1] = nWidth; + psDBF->panFieldDecimals[psDBF->nFields - 1] = nDecimals; + psDBF->pachFieldType[psDBF->nFields - 1] = chType; -/* -------------------------------------------------------------------- */ -/* Extend the required header information. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Extend the required header information. */ + /* -------------------------------------------------------------------- */ psDBF->nHeaderLength += XBASE_FLDHDR_SZ; psDBF->bUpdated = FALSE; - psDBF->pszHeader = STATIC_CAST(char *, SfRealloc(psDBF->pszHeader, - psDBF->nFields*XBASE_FLDHDR_SZ)); + psDBF->pszHeader = STATIC_CAST( + char *, realloc(psDBF->pszHeader, psDBF->nFields * XBASE_FLDHDR_SZ)); - pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * (psDBF->nFields-1); + char *pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * (psDBF->nFields - 1); - for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + for (int i = 0; i < XBASE_FLDHDR_SZ; i++) pszFInfo[i] = '\0'; - strncpy( pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE ); + strncpy(pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE); - pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; + pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields - 1]; - if( chType == 'C' ) + if (chType == 'C') { pszFInfo[16] = STATIC_CAST(unsigned char, nWidth % 256); pszFInfo[17] = STATIC_CAST(unsigned char, nWidth / 256); @@ -1072,52 +856,61 @@ DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, pszFInfo[17] = STATIC_CAST(unsigned char, nDecimals); } -/* -------------------------------------------------------------------- */ -/* Make the current record buffer appropriately larger. */ -/* -------------------------------------------------------------------- */ - psDBF->pszCurrentRecord = STATIC_CAST(char *, SfRealloc(psDBF->pszCurrentRecord, - psDBF->nRecordLength)); + /* -------------------------------------------------------------------- */ + /* Make the current record buffer appropriately larger. */ + /* -------------------------------------------------------------------- */ + psDBF->pszCurrentRecord = STATIC_CAST( + char *, realloc(psDBF->pszCurrentRecord, psDBF->nRecordLength)); /* we're done if dealing with new .dbf */ - if( psDBF->bNoHeader ) - return( psDBF->nFields - 1 ); + if (psDBF->bNoHeader) + return (psDBF->nFields - 1); -/* -------------------------------------------------------------------- */ -/* For existing .dbf file, shift records */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* For existing .dbf file, shift records */ + /* -------------------------------------------------------------------- */ /* alloc record */ - pszRecord = STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); + char *pszRecord = + STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); - chFieldFill = DBFGetNullCharacter(chType); + const char chFieldFill = DBFGetNullCharacter(chType); - for (i = psDBF->nRecords-1; i >= 0; --i) + SAOffset nRecordOffset; + for (int i = psDBF->nRecords - 1; i >= 0; --i) { - nRecordOffset = nOldRecordLength * STATIC_CAST(SAOffset, i) + nOldHeaderLength; + nRecordOffset = + nOldRecordLength * STATIC_CAST(SAOffset, i) + nOldHeaderLength; /* load record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + if (psDBF->sHooks.FRead(pszRecord, nOldRecordLength, 1, psDBF->fp) != 1) + { + free(pszRecord); + return -1; + } /* set new field's value to NULL */ memset(pszRecord + nOldRecordLength, chFieldFill, nWidth); - nRecordOffset = psDBF->nRecordLength * STATIC_CAST(SAOffset, i) + psDBF->nHeaderLength; + nRecordOffset = psDBF->nRecordLength * STATIC_CAST(SAOffset, i) + + psDBF->nHeaderLength; /* move record to the new place*/ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(pszRecord, psDBF->nRecordLength, 1, psDBF->fp); } - if( psDBF->bWriteEndOfFileChar ) + if (psDBF->bWriteEndOfFileChar) { char ch = END_OF_FILE_CHARACTER; nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,psDBF->nRecords) + psDBF->nHeaderLength; + psDBF->nRecordLength * STATIC_CAST(SAOffset, psDBF->nRecords) + + psDBF->nHeaderLength; - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(&ch, 1, 1, psDBF->fp); } /* free record */ @@ -1125,13 +918,13 @@ DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, /* force update of header with new header, record length and new field */ psDBF->bNoHeader = TRUE; - DBFUpdateHeader( psDBF ); + DBFUpdateHeader(psDBF); psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; psDBF->bUpdated = TRUE; - return( psDBF->nFields-1 ); + return (psDBF->nFields - 1); } /************************************************************************/ @@ -1141,64 +934,64 @@ DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, /************************************************************************/ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, - char chReqType ) - + char chReqType) { - unsigned char *pabyRec; - void *pReturnField = SHPLIB_NULLPTR; - -/* -------------------------------------------------------------------- */ -/* Verify selection. */ -/* -------------------------------------------------------------------- */ - if( hEntity < 0 || hEntity >= psDBF->nRecords ) + /* -------------------------------------------------------------------- */ + /* Verify selection. */ + /* -------------------------------------------------------------------- */ + if (hEntity < 0 || hEntity >= psDBF->nRecords) return SHPLIB_NULLPTR; - if( iField < 0 || iField >= psDBF->nFields ) + if (iField < 0 || iField >= psDBF->nFields) return SHPLIB_NULLPTR; -/* -------------------------------------------------------------------- */ -/* Have we read the record? */ -/* -------------------------------------------------------------------- */ - if( !DBFLoadRecord( psDBF, hEntity ) ) + /* -------------------------------------------------------------------- */ + /* Have we read the record? */ + /* -------------------------------------------------------------------- */ + if (!DBFLoadRecord(psDBF, hEntity)) return SHPLIB_NULLPTR; - pabyRec = REINTERPRET_CAST(unsigned char *, psDBF->pszCurrentRecord); + const unsigned char *pabyRec = + REINTERPRET_CAST(const unsigned char *, psDBF->pszCurrentRecord); -/* -------------------------------------------------------------------- */ -/* Ensure we have room to extract the target field. */ -/* -------------------------------------------------------------------- */ - if( psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength ) + /* -------------------------------------------------------------------- */ + /* Ensure we have room to extract the target field. */ + /* -------------------------------------------------------------------- */ + if (psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength) { psDBF->nWorkFieldLength = psDBF->panFieldSize[iField] + 100; - if( psDBF->pszWorkField == SHPLIB_NULLPTR ) - psDBF->pszWorkField = STATIC_CAST(char *, malloc(psDBF->nWorkFieldLength)); + if (psDBF->pszWorkField == SHPLIB_NULLPTR) + psDBF->pszWorkField = + STATIC_CAST(char *, malloc(psDBF->nWorkFieldLength)); else - psDBF->pszWorkField = STATIC_CAST(char *, realloc(psDBF->pszWorkField, - psDBF->nWorkFieldLength)); + psDBF->pszWorkField = STATIC_CAST( + char *, realloc(psDBF->pszWorkField, psDBF->nWorkFieldLength)); } -/* -------------------------------------------------------------------- */ -/* Extract the requested field. */ -/* -------------------------------------------------------------------- */ - memcpy( psDBF->pszWorkField, - REINTERPRET_CAST(const char *, pabyRec) + psDBF->panFieldOffset[iField], - psDBF->panFieldSize[iField] ); + /* -------------------------------------------------------------------- */ + /* Extract the requested field. */ + /* -------------------------------------------------------------------- */ + memcpy(psDBF->pszWorkField, + REINTERPRET_CAST(const char *, pabyRec) + + psDBF->panFieldOffset[iField], + psDBF->panFieldSize[iField]); psDBF->pszWorkField[psDBF->panFieldSize[iField]] = '\0'; - pReturnField = psDBF->pszWorkField; + void *pReturnField = psDBF->pszWorkField; -/* -------------------------------------------------------------------- */ -/* Decode the field. */ -/* -------------------------------------------------------------------- */ - if( chReqType == 'I' ) + /* -------------------------------------------------------------------- */ + /* Decode the field. */ + /* -------------------------------------------------------------------- */ + if (chReqType == 'I') { psDBF->fieldValue.nIntField = atoi(psDBF->pszWorkField); pReturnField = &(psDBF->fieldValue.nIntField); } - else if( chReqType == 'N' ) + else if (chReqType == 'N') { - psDBF->fieldValue.dfDoubleField = psDBF->sHooks.Atof(psDBF->pszWorkField); + psDBF->fieldValue.dfDoubleField = + psDBF->sHooks.Atof(psDBF->pszWorkField); pReturnField = &(psDBF->fieldValue.dfDoubleField); } @@ -1209,17 +1002,17 @@ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, #ifdef TRIM_DBF_WHITESPACE else { - char *pchSrc, *pchDst; + char *pchSrc = psDBF->pszWorkField; + char *pchDst = pchSrc; - pchDst = pchSrc = psDBF->pszWorkField; - while( *pchSrc == ' ' ) + while (*pchSrc == ' ') pchSrc++; - while( *pchSrc != '\0' ) + while (*pchSrc != '\0') *(pchDst++) = *(pchSrc++); *pchDst = '\0'; - while( pchDst != psDBF->pszWorkField && *(--pchDst) == ' ' ) + while (pchDst != psDBF->pszWorkField && *(--pchDst) == ' ') *pchDst = '\0'; } #endif @@ -1233,15 +1026,13 @@ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, /* Read an integer attribute. */ /************************************************************************/ -int SHPAPI_CALL -DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) - +int SHPAPI_CALL DBFReadIntegerAttribute(DBFHandle psDBF, int iRecord, + int iField) { - int *pnValue; - - pnValue = STATIC_CAST(int *, DBFReadAttribute( psDBF, iRecord, iField, 'I' )); + int *pnValue = + STATIC_CAST(int *, DBFReadAttribute(psDBF, iRecord, iField, 'I')); - if( pnValue == SHPLIB_NULLPTR ) + if (pnValue == SHPLIB_NULLPTR) return 0; else return *pnValue; @@ -1253,18 +1044,16 @@ DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) /* Read a double attribute. */ /************************************************************************/ -double SHPAPI_CALL -DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) - +double SHPAPI_CALL DBFReadDoubleAttribute(DBFHandle psDBF, int iRecord, + int iField) { - double *pdValue; - - pdValue = STATIC_CAST(double *, DBFReadAttribute( psDBF, iRecord, iField, 'N' )); + double *pdValue = + STATIC_CAST(double *, DBFReadAttribute(psDBF, iRecord, iField, 'N')); - if( pdValue == SHPLIB_NULLPTR ) + if (pdValue == SHPLIB_NULLPTR) return 0.0; else - return *pdValue ; + return *pdValue; } /************************************************************************/ @@ -1274,10 +1063,10 @@ DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) /************************************************************************/ const char SHPAPI_CALL1(*) -DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) - + DBFReadStringAttribute(DBFHandle psDBF, int iRecord, int iField) { - return STATIC_CAST(const char *, DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); + return STATIC_CAST(const char *, + DBFReadAttribute(psDBF, iRecord, iField, 'C')); } /************************************************************************/ @@ -1287,12 +1076,42 @@ DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) /************************************************************************/ const char SHPAPI_CALL1(*) -DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) - + DBFReadLogicalAttribute(DBFHandle psDBF, int iRecord, int iField) { - return STATIC_CAST(const char *, DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); + return STATIC_CAST(const char *, + DBFReadAttribute(psDBF, iRecord, iField, 'L')); } +/************************************************************************/ +/* DBFReadDateAttribute() */ +/* */ +/* Read a date attribute. */ +/************************************************************************/ + +SHPDate SHPAPI_CALL DBFReadDateAttribute(DBFHandle psDBF, int iRecord, + int iField) +{ + const char *pdateValue = STATIC_CAST( + const char *, DBFReadAttribute(psDBF, iRecord, iField, 'D')); + + SHPDate date; + + if (pdateValue == SHPLIB_NULLPTR) + { + date.year = 0; + date.month = 0; + date.day = 0; + } + else if (3 != sscanf(pdateValue, "%4d%2d%2d", &date.year, &date.month, + &date.day)) + { + date.year = 0; + date.month = 0; + date.day = 0; + } + + return date; +} /************************************************************************/ /* DBFIsValueNULL() */ @@ -1300,43 +1119,55 @@ DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) /* Return TRUE if the passed string is NULL. */ /************************************************************************/ -static int DBFIsValueNULL( char chType, const char* pszValue ) +static bool DBFIsValueNULL(char chType, const char *pszValue, int size) { - int i; + if (pszValue == SHPLIB_NULLPTR) + return true; - if( pszValue == SHPLIB_NULLPTR ) - return TRUE; - - switch(chType) + switch (chType) { - case 'N': - case 'F': - /* - ** We accept all asterisks or all blanks as NULL - ** though according to the spec I think it should be all - ** asterisks. - */ - if( pszValue[0] == '*' ) - return TRUE; - - for( i = 0; pszValue[i] != '\0'; i++ ) + case 'N': + case 'F': + /* + ** We accept all asterisks or all blanks as NULL + ** though according to the spec I think it should be all + ** asterisks. + */ + if (pszValue[0] == '*') + return true; + + for (int i = 0; pszValue[i] != '\0'; i++) + { + if (pszValue[i] != ' ') + return false; + } + return true; + + case 'D': { - if( pszValue[i] != ' ' ) - return FALSE; + const char DIGIT_ZERO = '0'; + /* NULL date fields have value "00000000" or "0"*size */ + /* Some DBF files have fields filled with spaces */ + /* (trimmed by DBFReadStringAttribute) to indicate null */ + /* values for dates (#4265). */ + /* And others have ' 0': https://lists.osgeo.org/pipermail/gdal-dev/2023-November/058010.html */ + /* And others just empty string: https://github.com/OSGeo/gdal/issues/10405 */ + if (pszValue[0] == 0 || strncmp(pszValue, "00000000", 8) == 0 || + strcmp(pszValue, " ") == 0 || strcmp(pszValue, "0") == 0) + return true; + for (int i = 0; i < size; i++) + if (pszValue[i] != DIGIT_ZERO) + return false; + return true; } - return TRUE; - - case 'D': - /* NULL date fields have value "00000000" */ - return strncmp(pszValue,"00000000",8) == 0; - case 'L': - /* NULL boolean fields have value "?" */ - return pszValue[0] == '?'; + case 'L': + /* NULL boolean fields have value "?" */ + return pszValue[0] == '?'; - default: - /* empty string fields are considered NULL */ - return strlen(pszValue) == 0; + default: + /* empty string fields are considered NULL */ + return strlen(pszValue) == 0; } } @@ -1348,18 +1179,16 @@ static int DBFIsValueNULL( char chType, const char* pszValue ) /* Contributed by Jim Matthews. */ /************************************************************************/ -int SHPAPI_CALL -DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) - +int SHPAPI_CALL DBFIsAttributeNULL(const DBFHandle psDBF, int iRecord, + int iField) { - const char *pszValue; + const char *pszValue = DBFReadStringAttribute(psDBF, iRecord, iField); - pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); - - if( pszValue == SHPLIB_NULLPTR ) + if (pszValue == SHPLIB_NULLPTR) return TRUE; - return DBFIsValueNULL( psDBF->pachFieldType[iField], pszValue ); + return DBFIsValueNULL(psDBF->pachFieldType[iField], pszValue, + psDBF->panFieldSize[iField]); } /************************************************************************/ @@ -1368,11 +1197,9 @@ DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) /* Return the number of fields in this table. */ /************************************************************************/ -int SHPAPI_CALL -DBFGetFieldCount( DBFHandle psDBF ) - +int SHPAPI_CALL DBFGetFieldCount(const DBFHandle psDBF) { - return( psDBF->nFields ); + return (psDBF->nFields); } /************************************************************************/ @@ -1381,11 +1208,9 @@ DBFGetFieldCount( DBFHandle psDBF ) /* Return the number of records in this table. */ /************************************************************************/ -int SHPAPI_CALL -DBFGetRecordCount( DBFHandle psDBF ) - +int SHPAPI_CALL DBFGetRecordCount(const DBFHandle psDBF) { - return( psDBF->nRecords ); + return (psDBF->nRecords); } /************************************************************************/ @@ -1396,168 +1221,184 @@ DBFGetRecordCount( DBFHandle psDBF ) /* bytes long. */ /************************************************************************/ -DBFFieldType SHPAPI_CALL -DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, - int * pnWidth, int * pnDecimals ) - +DBFFieldType SHPAPI_CALL DBFGetFieldInfo(const DBFHandle psDBF, int iField, + char *pszFieldName, int *pnWidth, + int *pnDecimals) { - if( iField < 0 || iField >= psDBF->nFields ) - return( FTInvalid ); + if (iField < 0 || iField >= psDBF->nFields) + return (FTInvalid); - if( pnWidth != SHPLIB_NULLPTR ) + if (pnWidth != SHPLIB_NULLPTR) *pnWidth = psDBF->panFieldSize[iField]; - if( pnDecimals != SHPLIB_NULLPTR ) + if (pnDecimals != SHPLIB_NULLPTR) *pnDecimals = psDBF->panFieldDecimals[iField]; - if( pszFieldName != SHPLIB_NULLPTR ) + if (pszFieldName != SHPLIB_NULLPTR) { - int i; - - strncpy( pszFieldName, STATIC_CAST(char *,psDBF->pszHeader)+iField*XBASE_FLDHDR_SZ, - XBASE_FLDNAME_LEN_READ ); - pszFieldName[XBASE_FLDNAME_LEN_READ] = '\0'; - for( i = XBASE_FLDNAME_LEN_READ - 1; i > 0 && pszFieldName[i] == ' '; i-- ) - pszFieldName[i] = '\0'; + strncpy(pszFieldName, + STATIC_CAST(char *, psDBF->pszHeader) + + iField * XBASE_FLDHDR_SZ, + XBASE_FLDNAME_LEN_READ); + pszFieldName[XBASE_FLDNAME_LEN_READ] = '\0'; + for (int i = XBASE_FLDNAME_LEN_READ - 1; + i > 0 && pszFieldName[i] == ' '; i--) + pszFieldName[i] = '\0'; } - if ( psDBF->pachFieldType[iField] == 'L' ) - return( FTLogical ); + if (psDBF->pachFieldType[iField] == 'L') + return (FTLogical); - else if( psDBF->pachFieldType[iField] == 'D' ) - return( FTDate ); + else if (psDBF->pachFieldType[iField] == 'D') + return (FTDate); - else if( psDBF->pachFieldType[iField] == 'N' - || psDBF->pachFieldType[iField] == 'F' ) + else if (psDBF->pachFieldType[iField] == 'N' || + psDBF->pachFieldType[iField] == 'F') { - if( psDBF->panFieldDecimals[iField] > 0 - || psDBF->panFieldSize[iField] >= 10 ) - return( FTDouble ); - else - return( FTInteger ); + if (psDBF->panFieldDecimals[iField] > 0 || + psDBF->panFieldSize[iField] >= 10) + return (FTDouble); + else + return (FTInteger); } else { - return( FTString ); + return (FTString); } } /************************************************************************/ /* DBFWriteAttribute() */ -/* */ -/* Write an attribute record to the file. */ +/* */ +/* Write an attribute record to the file. */ /************************************************************************/ -static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, - void * pValue ) - +static bool DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, + void *pValue) { - int i, j, nRetResult = TRUE; - unsigned char *pabyRec; - char szSField[XBASE_FLD_MAX_WIDTH+1], szFormat[20]; + /* -------------------------------------------------------------------- */ + /* Is this a valid record? */ + /* -------------------------------------------------------------------- */ + if (hEntity < 0 || hEntity > psDBF->nRecords) + return false; -/* -------------------------------------------------------------------- */ -/* Is this a valid record? */ -/* -------------------------------------------------------------------- */ - if( hEntity < 0 || hEntity > psDBF->nRecords ) - return( FALSE ); - - if( psDBF->bNoHeader ) + if (psDBF->bNoHeader) DBFWriteHeader(psDBF); -/* -------------------------------------------------------------------- */ -/* Is this a brand new record? */ -/* -------------------------------------------------------------------- */ - if( hEntity == psDBF->nRecords ) + /* -------------------------------------------------------------------- */ + /* Is this a brand new record? */ + /* -------------------------------------------------------------------- */ + if (hEntity == psDBF->nRecords) { - if( !DBFFlushRecord( psDBF ) ) - return FALSE; + if (!DBFFlushRecord(psDBF)) + return false; - psDBF->nRecords++; - for( i = 0; i < psDBF->nRecordLength; i++ ) - psDBF->pszCurrentRecord[i] = ' '; + psDBF->nRecords++; + for (int i = 0; i < psDBF->nRecordLength; i++) + psDBF->pszCurrentRecord[i] = ' '; - psDBF->nCurrentRecord = hEntity; + psDBF->nCurrentRecord = hEntity; } -/* -------------------------------------------------------------------- */ -/* Is this an existing record, but different than the last one */ -/* we accessed? */ -/* -------------------------------------------------------------------- */ - if( !DBFLoadRecord( psDBF, hEntity ) ) - return FALSE; + /* -------------------------------------------------------------------- */ + /* Is this an existing record, but different than the last one */ + /* we accessed? */ + /* -------------------------------------------------------------------- */ + if (!DBFLoadRecord(psDBF, hEntity)) + return false; - pabyRec = REINTERPRET_CAST(unsigned char *,psDBF->pszCurrentRecord); + unsigned char *pabyRec = + REINTERPRET_CAST(unsigned char *, psDBF->pszCurrentRecord); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; -/* -------------------------------------------------------------------- */ -/* Translate NULL value to valid DBF file representation. */ -/* */ -/* Contributed by Jim Matthews. */ -/* -------------------------------------------------------------------- */ - if( pValue == SHPLIB_NULLPTR ) + /* -------------------------------------------------------------------- */ + /* Translate NULL value to valid DBF file representation. */ + /* */ + /* Contributed by Jim Matthews. */ + /* -------------------------------------------------------------------- */ + if (pValue == SHPLIB_NULLPTR) { - memset( pabyRec+psDBF->panFieldOffset[iField], - DBFGetNullCharacter(psDBF->pachFieldType[iField]), - psDBF->panFieldSize[iField] ); - return TRUE; + memset(pabyRec + psDBF->panFieldOffset[iField], + DBFGetNullCharacter(psDBF->pachFieldType[iField]), + psDBF->panFieldSize[iField]); + return true; } -/* -------------------------------------------------------------------- */ -/* Assign all the record fields. */ -/* -------------------------------------------------------------------- */ - switch( psDBF->pachFieldType[iField] ) + /* -------------------------------------------------------------------- */ + /* Assign all the record fields. */ + /* -------------------------------------------------------------------- */ + bool nRetResult = true; + + switch (psDBF->pachFieldType[iField]) { - case 'D': - case 'N': - case 'F': - { - int nWidth = psDBF->panFieldSize[iField]; - - if( STATIC_CAST(int,sizeof(szSField))-2 < nWidth ) - nWidth = sizeof(szSField)-2; - - snprintf( szFormat, sizeof(szFormat), "%%%d.%df", - nWidth, psDBF->panFieldDecimals[iField] ); - CPLsnprintf(szSField, sizeof(szSField), szFormat, *STATIC_CAST(double *, pValue) ); - szSField[sizeof(szSField)-1] = '\0'; - if( STATIC_CAST(int,strlen(szSField)) > psDBF->panFieldSize[iField] ) + case 'D': + case 'N': + case 'F': { - szSField[psDBF->panFieldSize[iField]] = '\0'; - nRetResult = FALSE; - } - strncpy(REINTERPRET_CAST(char *, pabyRec+psDBF->panFieldOffset[iField]), - szSField, strlen(szSField) ); - break; - } - - case 'L': - if (psDBF->panFieldSize[iField] >= 1 && - (*STATIC_CAST(char*,pValue) == 'F' || *STATIC_CAST(char*,pValue) == 'T')) - *(pabyRec+psDBF->panFieldOffset[iField]) = *STATIC_CAST(char*,pValue); - break; - - default: - if( STATIC_CAST(int, strlen(STATIC_CAST(char *,pValue))) > psDBF->panFieldSize[iField] ) - { - j = psDBF->panFieldSize[iField]; - nRetResult = FALSE; + int nWidth = psDBF->panFieldSize[iField]; + + char szSField[XBASE_FLD_MAX_WIDTH + 1]; + if (STATIC_CAST(int, sizeof(szSField)) - 2 < nWidth) + nWidth = sizeof(szSField) - 2; + + char szFormat[20]; + snprintf(szFormat, sizeof(szFormat), "%%%d.%df", nWidth, + psDBF->panFieldDecimals[iField]); + CPLsnprintf(szSField, sizeof(szSField), szFormat, + *STATIC_CAST(double *, pValue)); + szSField[sizeof(szSField) - 1] = '\0'; + if (STATIC_CAST(int, strlen(szSField)) > + psDBF->panFieldSize[iField]) + { + szSField[psDBF->panFieldSize[iField]] = '\0'; + nRetResult = false; + } + memcpy(REINTERPRET_CAST(char *, + pabyRec + psDBF->panFieldOffset[iField]), + szSField, strlen(szSField)); + break; } - else + + case 'L': + if (psDBF->panFieldSize[iField] >= 1 && + (*STATIC_CAST(char *, pValue) == 'F' || + *STATIC_CAST(char *, pValue) == 'T')) + { + *(pabyRec + psDBF->panFieldOffset[iField]) = + *STATIC_CAST(char *, pValue); + } + else + { + nRetResult = false; + } + break; + + default: { - memset( pabyRec+psDBF->panFieldOffset[iField], ' ', - psDBF->panFieldSize[iField] ); - j = STATIC_CAST(int, strlen(STATIC_CAST(char *,pValue))); - } + int j; + if (STATIC_CAST(int, strlen(STATIC_CAST(char *, pValue))) > + psDBF->panFieldSize[iField]) + { + j = psDBF->panFieldSize[iField]; + nRetResult = false; + } + else + { + memset(pabyRec + psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField]); + j = STATIC_CAST(int, strlen(STATIC_CAST(char *, pValue))); + } - strncpy(REINTERPRET_CAST(char *, pabyRec+psDBF->panFieldOffset[iField]), - STATIC_CAST(const char *, pValue), j ); - break; + strncpy(REINTERPRET_CAST(char *, + pabyRec + psDBF->panFieldOffset[iField]), + STATIC_CAST(const char *, pValue), j); + break; + } } - return( nRetResult ); + return nRetResult; } /************************************************************************/ @@ -1568,66 +1409,68 @@ static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, /* as is to the field position in the record. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, - void * pValue ) - +int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, + int iField, const void *pValue) { - int i, j; - unsigned char *pabyRec; + /* -------------------------------------------------------------------- */ + /* Is this a valid record? */ + /* -------------------------------------------------------------------- */ + if (hEntity < 0 || hEntity > psDBF->nRecords) + return (FALSE); -/* -------------------------------------------------------------------- */ -/* Is this a valid record? */ -/* -------------------------------------------------------------------- */ - if( hEntity < 0 || hEntity > psDBF->nRecords ) - return( FALSE ); - - if( psDBF->bNoHeader ) + if (psDBF->bNoHeader) DBFWriteHeader(psDBF); -/* -------------------------------------------------------------------- */ -/* Is this a brand new record? */ -/* -------------------------------------------------------------------- */ - if( hEntity == psDBF->nRecords ) + /* -------------------------------------------------------------------- */ + /* Is this a brand new record? */ + /* -------------------------------------------------------------------- */ + if (hEntity == psDBF->nRecords) { - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return FALSE; - psDBF->nRecords++; - for( i = 0; i < psDBF->nRecordLength; i++ ) - psDBF->pszCurrentRecord[i] = ' '; + psDBF->nRecords++; + for (int i = 0; i < psDBF->nRecordLength; i++) + psDBF->pszCurrentRecord[i] = ' '; - psDBF->nCurrentRecord = hEntity; + psDBF->nCurrentRecord = hEntity; } -/* -------------------------------------------------------------------- */ -/* Is this an existing record, but different than the last one */ -/* we accessed? */ -/* -------------------------------------------------------------------- */ - if( !DBFLoadRecord( psDBF, hEntity ) ) + /* -------------------------------------------------------------------- */ + /* Is this an existing record, but different than the last one */ + /* we accessed? */ + /* -------------------------------------------------------------------- */ + if (!DBFLoadRecord(psDBF, hEntity)) return FALSE; - pabyRec = REINTERPRET_CAST(unsigned char *, psDBF->pszCurrentRecord); - -/* -------------------------------------------------------------------- */ -/* Assign all the record fields. */ -/* -------------------------------------------------------------------- */ - if( STATIC_CAST(int, strlen(STATIC_CAST(char *, pValue))) > psDBF->panFieldSize[iField] ) - j = psDBF->panFieldSize[iField]; - else + if (iField >= 0) { - memset( pabyRec+psDBF->panFieldOffset[iField], ' ', - psDBF->panFieldSize[iField] ); - j = STATIC_CAST(int, strlen(STATIC_CAST(char *, pValue))); - } + unsigned char *pabyRec = + REINTERPRET_CAST(unsigned char *, psDBF->pszCurrentRecord); + + /* -------------------------------------------------------------------- */ + /* Assign all the record fields. */ + /* -------------------------------------------------------------------- */ + int j; + if (STATIC_CAST(int, strlen(STATIC_CAST(const char *, pValue))) > + psDBF->panFieldSize[iField]) + j = psDBF->panFieldSize[iField]; + else + { + memset(pabyRec + psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField]); + j = STATIC_CAST(int, strlen(STATIC_CAST(const char *, pValue))); + } - strncpy(REINTERPRET_CAST(char *, pabyRec+psDBF->panFieldOffset[iField]), - STATIC_CAST(const char *, pValue), j ); + memcpy( + REINTERPRET_CAST(char *, pabyRec + psDBF->panFieldOffset[iField]), + STATIC_CAST(const char *, pValue), j); + } psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; - return( TRUE ); + return (TRUE); } /************************************************************************/ @@ -1636,28 +1479,26 @@ DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, /* Write a double attribute. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, - double dValue ) - +int SHPAPI_CALL DBFWriteDoubleAttribute(DBFHandle psDBF, int iRecord, + int iField, double dValue) { - return( DBFWriteAttribute( psDBF, iRecord, iField, STATIC_CAST(void *, &dValue) ) ); + return (DBFWriteAttribute(psDBF, iRecord, iField, + STATIC_CAST(void *, &dValue))); } /************************************************************************/ /* DBFWriteIntegerAttribute() */ /* */ -/* Write a integer attribute. */ +/* Write an integer attribute. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, - int nValue ) - +int SHPAPI_CALL DBFWriteIntegerAttribute(DBFHandle psDBF, int iRecord, + int iField, int nValue) { - double dValue = nValue; + double dValue = nValue; - return( DBFWriteAttribute( psDBF, iRecord, iField, STATIC_CAST(void *, &dValue) ) ); + return (DBFWriteAttribute(psDBF, iRecord, iField, + STATIC_CAST(void *, &dValue))); } /************************************************************************/ @@ -1666,25 +1507,23 @@ DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, /* Write a string attribute. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, - const char * pszValue ) - +int SHPAPI_CALL DBFWriteStringAttribute(DBFHandle psDBF, int iRecord, + int iField, const char *pszValue) { - return( DBFWriteAttribute( psDBF, iRecord, iField, STATIC_CAST(void *, CONST_CAST(char*, pszValue))) ); + return ( + DBFWriteAttribute(psDBF, iRecord, iField, + STATIC_CAST(void *, CONST_CAST(char *, pszValue)))); } /************************************************************************/ /* DBFWriteNULLAttribute() */ /* */ -/* Write a string attribute. */ +/* Write a NULL attribute. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) - +int SHPAPI_CALL DBFWriteNULLAttribute(DBFHandle psDBF, int iRecord, int iField) { - return( DBFWriteAttribute( psDBF, iRecord, iField, SHPLIB_NULLPTR ) ); + return (DBFWriteAttribute(psDBF, iRecord, iField, SHPLIB_NULLPTR)); } /************************************************************************/ @@ -1693,66 +1532,87 @@ DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) /* Write a logical attribute. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, - const char lValue) +int SHPAPI_CALL DBFWriteLogicalAttribute(DBFHandle psDBF, int iRecord, + int iField, const char lValue) +{ + return ( + DBFWriteAttribute(psDBF, iRecord, iField, + STATIC_CAST(void *, CONST_CAST(char *, &lValue)))); +} + +/************************************************************************/ +/* DBFWriteDateAttribute() */ +/* */ +/* Write a date attribute. */ +/************************************************************************/ +int SHPAPI_CALL DBFWriteDateAttribute(DBFHandle psDBF, int iRecord, int iField, + const SHPDate *lValue) { - return( DBFWriteAttribute( psDBF, iRecord, iField, STATIC_CAST(void *, CONST_CAST(char*, &lValue)) ) ); + if (SHPLIB_NULLPTR == lValue) + return false; + /* check for supported digit range, but do not check for valid date */ + if (lValue->year < 0 || lValue->year > 9999) + return false; + if (lValue->month < 0 || lValue->month > 99) + return false; + if (lValue->day < 0 || lValue->day > 99) + return false; + char dateValue[9]; /* "yyyyMMdd\0" */ + snprintf(dateValue, sizeof(dateValue), "%04d%02d%02d", lValue->year, + lValue->month, lValue->day); + return (DBFWriteAttributeDirectly(psDBF, iRecord, iField, dateValue)); } /************************************************************************/ /* DBFWriteTuple() */ -/* */ -/* Write an attribute record to the file. */ +/* */ +/* Write an attribute record to the file. */ /************************************************************************/ -int SHPAPI_CALL -DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) - +int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, + const void *pRawTuple) { - int i; - unsigned char *pabyRec; + /* -------------------------------------------------------------------- */ + /* Is this a valid record? */ + /* -------------------------------------------------------------------- */ + if (hEntity < 0 || hEntity > psDBF->nRecords) + return (FALSE); -/* -------------------------------------------------------------------- */ -/* Is this a valid record? */ -/* -------------------------------------------------------------------- */ - if( hEntity < 0 || hEntity > psDBF->nRecords ) - return( FALSE ); - - if( psDBF->bNoHeader ) + if (psDBF->bNoHeader) DBFWriteHeader(psDBF); -/* -------------------------------------------------------------------- */ -/* Is this a brand new record? */ -/* -------------------------------------------------------------------- */ - if( hEntity == psDBF->nRecords ) + /* -------------------------------------------------------------------- */ + /* Is this a brand new record? */ + /* -------------------------------------------------------------------- */ + if (hEntity == psDBF->nRecords) { - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return FALSE; - psDBF->nRecords++; - for( i = 0; i < psDBF->nRecordLength; i++ ) - psDBF->pszCurrentRecord[i] = ' '; + psDBF->nRecords++; + for (int i = 0; i < psDBF->nRecordLength; i++) + psDBF->pszCurrentRecord[i] = ' '; - psDBF->nCurrentRecord = hEntity; + psDBF->nCurrentRecord = hEntity; } -/* -------------------------------------------------------------------- */ -/* Is this an existing record, but different than the last one */ -/* we accessed? */ -/* -------------------------------------------------------------------- */ - if( !DBFLoadRecord( psDBF, hEntity ) ) + /* -------------------------------------------------------------------- */ + /* Is this an existing record, but different than the last one */ + /* we accessed? */ + /* -------------------------------------------------------------------- */ + if (!DBFLoadRecord(psDBF, hEntity)) return FALSE; - pabyRec = REINTERPRET_CAST(unsigned char *, psDBF->pszCurrentRecord); + unsigned char *pabyRec = + REINTERPRET_CAST(unsigned char *, psDBF->pszCurrentRecord); - memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); + memcpy(pabyRec, pRawTuple, psDBF->nRecordLength); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; - return( TRUE ); + return (TRUE); } /************************************************************************/ @@ -1762,63 +1622,72 @@ DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) /* till the next record read for any reason. */ /************************************************************************/ -const char SHPAPI_CALL1(*) -DBFReadTuple(DBFHandle psDBF, int hEntity ) - +const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity) { - if( hEntity < 0 || hEntity >= psDBF->nRecords ) + if (hEntity < 0 || hEntity >= psDBF->nRecords) return SHPLIB_NULLPTR; - if( !DBFLoadRecord( psDBF, hEntity ) ) + if (!DBFLoadRecord(psDBF, hEntity)) return SHPLIB_NULLPTR; return STATIC_CAST(const char *, psDBF->pszCurrentRecord); } /************************************************************************/ -/* DBFCloneEmpty() */ +/* DBFCloneEmpty() */ /* */ -/* Read one of the attribute fields of a record. */ +/* Create a new .dbf file with same code page and field */ +/* definitions as the given handle. */ /************************************************************************/ -DBFHandle SHPAPI_CALL -DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) +DBFHandle SHPAPI_CALL DBFCloneEmpty(const DBFHandle psDBF, + const char *pszFilename) { - DBFHandle newDBF; - - newDBF = DBFCreateEx ( pszFilename, psDBF->pszCodePage ); - if ( newDBF == SHPLIB_NULLPTR ) return SHPLIB_NULLPTR; - - newDBF->nFields = psDBF->nFields; - newDBF->nRecordLength = psDBF->nRecordLength; - newDBF->nHeaderLength = psDBF->nHeaderLength; - - if( psDBF->pszHeader ) - { - newDBF->pszHeader = STATIC_CAST(char *, malloc ( XBASE_FLDHDR_SZ * psDBF->nFields )); - memcpy ( newDBF->pszHeader, psDBF->pszHeader, XBASE_FLDHDR_SZ * psDBF->nFields ); - } - - newDBF->panFieldOffset = STATIC_CAST(int *, malloc ( sizeof(int) * psDBF->nFields )); - memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); - newDBF->panFieldSize = STATIC_CAST(int *, malloc ( sizeof(int) * psDBF->nFields )); - memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); - newDBF->panFieldDecimals = STATIC_CAST(int *, malloc ( sizeof(int) * psDBF->nFields )); - memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); - newDBF->pachFieldType = STATIC_CAST(char *, malloc ( sizeof(char) * psDBF->nFields )); - memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(char)*psDBF->nFields ); - - newDBF->bNoHeader = TRUE; - newDBF->bUpdated = TRUE; - newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + DBFHandle newDBF = + DBFCreateLL(pszFilename, psDBF->pszCodePage, &psDBF->sHooks); + if (newDBF == SHPLIB_NULLPTR) + return SHPLIB_NULLPTR; - DBFWriteHeader ( newDBF ); - DBFClose ( newDBF ); + newDBF->nFields = psDBF->nFields; + newDBF->nRecordLength = psDBF->nRecordLength; + newDBF->nHeaderLength = psDBF->nHeaderLength; - newDBF = DBFOpen ( pszFilename, "rb+" ); - newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + if (psDBF->pszHeader) + { + newDBF->pszHeader = + STATIC_CAST(char *, malloc(XBASE_FLDHDR_SZ * psDBF->nFields)); + memcpy(newDBF->pszHeader, psDBF->pszHeader, + XBASE_FLDHDR_SZ * psDBF->nFields); + } - return ( newDBF ); + newDBF->panFieldOffset = + STATIC_CAST(int *, malloc(sizeof(int) * psDBF->nFields)); + memcpy(newDBF->panFieldOffset, psDBF->panFieldOffset, + sizeof(int) * psDBF->nFields); + newDBF->panFieldSize = + STATIC_CAST(int *, malloc(sizeof(int) * psDBF->nFields)); + memcpy(newDBF->panFieldSize, psDBF->panFieldSize, + sizeof(int) * psDBF->nFields); + newDBF->panFieldDecimals = + STATIC_CAST(int *, malloc(sizeof(int) * psDBF->nFields)); + memcpy(newDBF->panFieldDecimals, psDBF->panFieldDecimals, + sizeof(int) * psDBF->nFields); + newDBF->pachFieldType = + STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nFields)); + memcpy(newDBF->pachFieldType, psDBF->pachFieldType, + sizeof(char) * psDBF->nFields); + + newDBF->bNoHeader = TRUE; + newDBF->bUpdated = TRUE; + newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + + DBFWriteHeader(newDBF); + DBFClose(newDBF); + + newDBF = DBFOpen(pszFilename, "rb+"); + newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + + return (newDBF); } /************************************************************************/ @@ -1832,14 +1701,12 @@ DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) /* 'M' (Memo: 10 digits .DBT block ptr) */ /************************************************************************/ -char SHPAPI_CALL -DBFGetNativeFieldType( DBFHandle psDBF, int iField ) - +char SHPAPI_CALL DBFGetNativeFieldType(const DBFHandle psDBF, int iField) { - if( iField >=0 && iField < psDBF->nFields ) + if (iField >= 0 && iField < psDBF->nFields) return psDBF->pachFieldType[iField]; - return ' '; + return ' '; } /************************************************************************/ @@ -1850,20 +1717,18 @@ DBFGetNativeFieldType( DBFHandle psDBF, int iField ) /* Contributed by Jim Matthews. */ /************************************************************************/ -int SHPAPI_CALL -DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) - +int SHPAPI_CALL DBFGetFieldIndex(const DBFHandle psDBF, + const char *pszFieldName) { - char name[XBASE_FLDNAME_LEN_READ+1]; - int i; + char name[XBASE_FLDNAME_LEN_READ + 1]; - for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) + for (int i = 0; i < DBFGetFieldCount(psDBF); i++) { - DBFGetFieldInfo( psDBF, i, name, SHPLIB_NULLPTR, SHPLIB_NULLPTR ); - if(!STRCASECMP(pszFieldName,name)) - return(i); + DBFGetFieldInfo(psDBF, i, name, SHPLIB_NULLPTR, SHPLIB_NULLPTR); + if (!STRCASECMP(pszFieldName, name)) + return (i); } - return(-1); + return (-1); } /************************************************************************/ @@ -1873,24 +1738,23 @@ DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) /* it returns FALSE. */ /************************************************************************/ -int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) - +int SHPAPI_CALL DBFIsRecordDeleted(const DBFHandle psDBF, int iShape) { -/* -------------------------------------------------------------------- */ -/* Verify selection. */ -/* -------------------------------------------------------------------- */ - if( iShape < 0 || iShape >= psDBF->nRecords ) + /* -------------------------------------------------------------------- */ + /* Verify selection. */ + /* -------------------------------------------------------------------- */ + if (iShape < 0 || iShape >= psDBF->nRecords) return TRUE; -/* -------------------------------------------------------------------- */ -/* Have we read the record? */ -/* -------------------------------------------------------------------- */ - if( !DBFLoadRecord( psDBF, iShape ) ) + /* -------------------------------------------------------------------- */ + /* Have we read the record? */ + /* -------------------------------------------------------------------- */ + if (!DBFLoadRecord(psDBF, iShape)) return FALSE; -/* -------------------------------------------------------------------- */ -/* '*' means deleted. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* '*' means deleted. */ + /* -------------------------------------------------------------------- */ return psDBF->pszCurrentRecord[0] == '*'; } @@ -1898,34 +1762,32 @@ int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) /* DBFMarkRecordDeleted() */ /************************************************************************/ -int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, - int bIsDeleted ) - +int SHPAPI_CALL DBFMarkRecordDeleted(DBFHandle psDBF, int iShape, + int bIsDeleted) { - char chNewFlag; - -/* -------------------------------------------------------------------- */ -/* Verify selection. */ -/* -------------------------------------------------------------------- */ - if( iShape < 0 || iShape >= psDBF->nRecords ) + /* -------------------------------------------------------------------- */ + /* Verify selection. */ + /* -------------------------------------------------------------------- */ + if (iShape < 0 || iShape >= psDBF->nRecords) return FALSE; -/* -------------------------------------------------------------------- */ -/* Is this an existing record, but different than the last one */ -/* we accessed? */ -/* -------------------------------------------------------------------- */ - if( !DBFLoadRecord( psDBF, iShape ) ) + /* -------------------------------------------------------------------- */ + /* Is this an existing record, but different than the last one */ + /* we accessed? */ + /* -------------------------------------------------------------------- */ + if (!DBFLoadRecord(psDBF, iShape)) return FALSE; -/* -------------------------------------------------------------------- */ -/* Assign value, marking record as dirty if it changes. */ -/* -------------------------------------------------------------------- */ - if( bIsDeleted ) + /* -------------------------------------------------------------------- */ + /* Assign value, marking record as dirty if it changes. */ + /* -------------------------------------------------------------------- */ + char chNewFlag; + if (bIsDeleted) chNewFlag = '*'; else chNewFlag = ' '; - if( psDBF->pszCurrentRecord[0] != chNewFlag ) + if (psDBF->pszCurrentRecord[0] != chNewFlag) { psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; @@ -1939,10 +1801,9 @@ int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, /* DBFGetCodePage */ /************************************************************************/ -const char SHPAPI_CALL1(*) -DBFGetCodePage(DBFHandle psDBF ) +const char SHPAPI_CALL1(*) DBFGetCodePage(const DBFHandle psDBF) { - if( psDBF == SHPLIB_NULLPTR ) + if (psDBF == SHPLIB_NULLPTR) return SHPLIB_NULLPTR; return psDBF->pszCodePage; } @@ -1953,109 +1814,110 @@ DBFGetCodePage(DBFHandle psDBF ) /* Remove a field from a .dbf file */ /************************************************************************/ -int SHPAPI_CALL -DBFDeleteField(DBFHandle psDBF, int iField) +int SHPAPI_CALL DBFDeleteField(DBFHandle psDBF, int iField) { - int nOldRecordLength, nOldHeaderLength; - int nDeletedFieldOffset, nDeletedFieldSize; - SAOffset nRecordOffset; - char* pszRecord; - int i, iRecord; - if (iField < 0 || iField >= psDBF->nFields) return FALSE; /* make sure that everything is written in .dbf */ - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return FALSE; /* get information about field to be deleted */ - nOldRecordLength = psDBF->nRecordLength; - nOldHeaderLength = psDBF->nHeaderLength; - nDeletedFieldOffset = psDBF->panFieldOffset[iField]; - nDeletedFieldSize = psDBF->panFieldSize[iField]; + int nOldRecordLength = psDBF->nRecordLength; + int nOldHeaderLength = psDBF->nHeaderLength; + int nDeletedFieldOffset = psDBF->panFieldOffset[iField]; + int nDeletedFieldSize = psDBF->panFieldSize[iField]; /* update fields info */ - for (i = iField + 1; i < psDBF->nFields; i++) + for (int i = iField + 1; i < psDBF->nFields; i++) { - psDBF->panFieldOffset[i-1] = psDBF->panFieldOffset[i] - nDeletedFieldSize; - psDBF->panFieldSize[i-1] = psDBF->panFieldSize[i]; - psDBF->panFieldDecimals[i-1] = psDBF->panFieldDecimals[i]; - psDBF->pachFieldType[i-1] = psDBF->pachFieldType[i]; + psDBF->panFieldOffset[i - 1] = + psDBF->panFieldOffset[i] - nDeletedFieldSize; + psDBF->panFieldSize[i - 1] = psDBF->panFieldSize[i]; + psDBF->panFieldDecimals[i - 1] = psDBF->panFieldDecimals[i]; + psDBF->pachFieldType[i - 1] = psDBF->pachFieldType[i]; } /* resize fields arrays */ psDBF->nFields--; - psDBF->panFieldOffset = STATIC_CAST(int *, - SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields )); + psDBF->panFieldOffset = STATIC_CAST( + int *, realloc(psDBF->panFieldOffset, sizeof(int) * psDBF->nFields)); - psDBF->panFieldSize = STATIC_CAST(int *, - SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields )); + psDBF->panFieldSize = STATIC_CAST( + int *, realloc(psDBF->panFieldSize, sizeof(int) * psDBF->nFields)); - psDBF->panFieldDecimals = STATIC_CAST(int *, - SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields )); + psDBF->panFieldDecimals = STATIC_CAST( + int *, realloc(psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields)); - psDBF->pachFieldType = STATIC_CAST(char *, - SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields )); + psDBF->pachFieldType = STATIC_CAST( + char *, realloc(psDBF->pachFieldType, sizeof(char) * psDBF->nFields)); /* update header information */ psDBF->nHeaderLength -= XBASE_FLDHDR_SZ; psDBF->nRecordLength -= nDeletedFieldSize; /* overwrite field information in header */ - memmove(psDBF->pszHeader + iField*XBASE_FLDHDR_SZ, - psDBF->pszHeader + (iField+1)*XBASE_FLDHDR_SZ, - sizeof(char) * (psDBF->nFields - iField)*XBASE_FLDHDR_SZ); + memmove(psDBF->pszHeader + iField * XBASE_FLDHDR_SZ, + psDBF->pszHeader + (iField + 1) * XBASE_FLDHDR_SZ, + sizeof(char) * (psDBF->nFields - iField) * XBASE_FLDHDR_SZ); - psDBF->pszHeader = STATIC_CAST(char *, SfRealloc(psDBF->pszHeader, - psDBF->nFields*XBASE_FLDHDR_SZ)); + psDBF->pszHeader = STATIC_CAST( + char *, realloc(psDBF->pszHeader, psDBF->nFields * XBASE_FLDHDR_SZ)); /* update size of current record appropriately */ - psDBF->pszCurrentRecord = STATIC_CAST(char *, SfRealloc(psDBF->pszCurrentRecord, - psDBF->nRecordLength)); + psDBF->pszCurrentRecord = STATIC_CAST( + char *, realloc(psDBF->pszCurrentRecord, psDBF->nRecordLength)); /* we're done if we're dealing with not yet created .dbf */ - if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + if (psDBF->bNoHeader && psDBF->nRecords == 0) return TRUE; /* force update of header with new header and record length */ psDBF->bNoHeader = TRUE; - DBFUpdateHeader( psDBF ); + DBFUpdateHeader(psDBF); /* alloc record */ - pszRecord = STATIC_CAST(char *, malloc(sizeof(char) * nOldRecordLength)); + char *pszRecord = + STATIC_CAST(char *, malloc(sizeof(char) * nOldRecordLength)); /* shift records to their new positions */ - for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + for (int iRecord = 0; iRecord < psDBF->nRecords; iRecord++) { - nRecordOffset = - nOldRecordLength * STATIC_CAST(SAOffset,iRecord) + nOldHeaderLength; + SAOffset nRecordOffset = + nOldRecordLength * STATIC_CAST(SAOffset, iRecord) + + nOldHeaderLength; /* load record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + if (psDBF->sHooks.FRead(pszRecord, nOldRecordLength, 1, psDBF->fp) != 1) + { + free(pszRecord); + return FALSE; + } - nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; + nRecordOffset = psDBF->nRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; /* move record in two steps */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( pszRecord, nDeletedFieldOffset, 1, psDBF->fp ); - psDBF->sHooks.FWrite( pszRecord + nDeletedFieldOffset + nDeletedFieldSize, - nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, - 1, psDBF->fp ); - + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(pszRecord, nDeletedFieldOffset, 1, psDBF->fp); + psDBF->sHooks.FWrite( + pszRecord + nDeletedFieldOffset + nDeletedFieldSize, + nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, 1, + psDBF->fp); } - if( psDBF->bWriteEndOfFileChar ) + if (psDBF->bWriteEndOfFileChar) { char ch = END_OF_FILE_CHARACTER; SAOffset nEOFOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,psDBF->nRecords) + psDBF->nHeaderLength; + psDBF->nRecordLength * STATIC_CAST(SAOffset, psDBF->nRecords) + + psDBF->nHeaderLength; - psDBF->sHooks.FSeek( psDBF->fp, nEOFOffset, 0 ); - psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nEOFOffset, 0); + psDBF->sHooks.FWrite(&ch, 1, 1, psDBF->fp); } /* TODO: truncate file */ @@ -2080,36 +1942,30 @@ DBFDeleteField(DBFHandle psDBF, int iField) /* code of DBFReorderFields. */ /************************************************************************/ -int SHPAPI_CALL -DBFReorderFields( DBFHandle psDBF, int* panMap ) +int SHPAPI_CALL DBFReorderFields(DBFHandle psDBF, const int *panMap) { - SAOffset nRecordOffset; - int i, iRecord; - int *panFieldOffsetNew; - int *panFieldSizeNew; - int *panFieldDecimalsNew; - char *pachFieldTypeNew; - char *pszHeaderNew; - char *pszRecord; - char *pszRecordNew; - - if ( psDBF->nFields == 0 ) + if (psDBF->nFields == 0) return TRUE; /* make sure that everything is written in .dbf */ - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return FALSE; - /* a simple malloc() would be enough, but calloc() helps clang static analyzer */ - panFieldOffsetNew = STATIC_CAST(int *, calloc(sizeof(int), psDBF->nFields)); - panFieldSizeNew = STATIC_CAST(int *, calloc(sizeof(int), psDBF->nFields)); - panFieldDecimalsNew = STATIC_CAST(int *, calloc(sizeof(int), psDBF->nFields)); - pachFieldTypeNew = STATIC_CAST(char *, calloc(sizeof(char), psDBF->nFields)); - pszHeaderNew = STATIC_CAST(char*, malloc(sizeof(char) * XBASE_FLDHDR_SZ * - psDBF->nFields)); + /* a simple malloc() would be enough, but calloc() helps clang static + * analyzer */ + int *panFieldOffsetNew = + STATIC_CAST(int *, calloc(psDBF->nFields, sizeof(int))); + int *panFieldSizeNew = + STATIC_CAST(int *, calloc(psDBF->nFields, sizeof(int))); + int *panFieldDecimalsNew = + STATIC_CAST(int *, calloc(psDBF->nFields, sizeof(int))); + char *pachFieldTypeNew = + STATIC_CAST(char *, calloc(psDBF->nFields, sizeof(char))); + char *pszHeaderNew = STATIC_CAST( + char *, malloc(sizeof(char) * XBASE_FLDHDR_SZ * psDBF->nFields)); /* shuffle fields definitions */ - for(i=0; i < psDBF->nFields; i++) + for (int i = 0; i < psDBF->nFields; i++) { panFieldSizeNew[i] = psDBF->panFieldSize[panMap[i]]; panFieldDecimalsNew[i] = psDBF->panFieldDecimals[panMap[i]]; @@ -2118,38 +1974,49 @@ DBFReorderFields( DBFHandle psDBF, int* panMap ) psDBF->pszHeader + panMap[i] * XBASE_FLDHDR_SZ, XBASE_FLDHDR_SZ); } panFieldOffsetNew[0] = 1; - for(i=1; i < psDBF->nFields; i++) + for (int i = 1; i < psDBF->nFields; i++) { - panFieldOffsetNew[i] = panFieldOffsetNew[i - 1] + panFieldSizeNew[i - 1]; + panFieldOffsetNew[i] = + panFieldOffsetNew[i - 1] + panFieldSizeNew[i - 1]; } free(psDBF->pszHeader); psDBF->pszHeader = pszHeaderNew; + bool errorAbort = false; + /* we're done if we're dealing with not yet created .dbf */ - if ( !(psDBF->bNoHeader && psDBF->nRecords == 0) ) + if (!(psDBF->bNoHeader && psDBF->nRecords == 0)) { /* force update of header with new header and record length */ psDBF->bNoHeader = TRUE; - DBFUpdateHeader( psDBF ); + DBFUpdateHeader(psDBF); /* alloc record */ - pszRecord = STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); - pszRecordNew = STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); + char *pszRecord = + STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); + char *pszRecordNew = + STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); /* shuffle fields in records */ - for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + for (int iRecord = 0; iRecord < psDBF->nRecords; iRecord++) { - nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; + const SAOffset nRecordOffset = + psDBF->nRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; /* load record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FRead( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + if (psDBF->sHooks.FRead(pszRecord, psDBF->nRecordLength, 1, + psDBF->fp) != 1) + { + errorAbort = true; + break; + } pszRecordNew[0] = pszRecord[0]; - for(i=0; i < psDBF->nFields; i++) + for (int i = 0; i < psDBF->nFields; i++) { memcpy(pszRecordNew + panFieldOffsetNew[i], pszRecord + psDBF->panFieldOffset[panMap[i]], @@ -2157,8 +2024,9 @@ DBFReorderFields( DBFHandle psDBF, int* panMap ) } /* write record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( pszRecordNew, psDBF->nRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(pszRecordNew, psDBF->nRecordLength, 1, + psDBF->fp); } /* free record */ @@ -2166,6 +2034,18 @@ DBFReorderFields( DBFHandle psDBF, int* panMap ) free(pszRecordNew); } + if (errorAbort) + { + free(panFieldOffsetNew); + free(panFieldSizeNew); + free(panFieldDecimalsNew); + free(pachFieldTypeNew); + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = FALSE; + return FALSE; + } + free(psDBF->panFieldOffset); free(psDBF->panFieldSize); free(psDBF->panFieldDecimals); @@ -2173,7 +2053,7 @@ DBFReorderFields( DBFHandle psDBF, int* panMap ) psDBF->panFieldOffset = panFieldOffsetNew; psDBF->panFieldSize = panFieldSizeNew; - psDBF->panFieldDecimals =panFieldDecimalsNew; + psDBF->panFieldDecimals = panFieldDecimalsNew; psDBF->pachFieldType = pachFieldTypeNew; psDBF->nCurrentRecord = -1; @@ -2183,71 +2063,59 @@ DBFReorderFields( DBFHandle psDBF, int* panMap ) return TRUE; } - /************************************************************************/ /* DBFAlterFieldDefn() */ /* */ /* Alter a field definition in a .dbf file */ /************************************************************************/ -int SHPAPI_CALL -DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, - char chType, int nWidth, int nDecimals ) +int SHPAPI_CALL DBFAlterFieldDefn(DBFHandle psDBF, int iField, + const char *pszFieldName, char chType, + int nWidth, int nDecimals) { - int i; - int iRecord; - int nOffset; - int nOldWidth; - int nOldRecordLength; - SAOffset nRecordOffset; - char* pszFInfo; - char chOldType; - int bIsNULL; - char chFieldFill; - if (iField < 0 || iField >= psDBF->nFields) return FALSE; /* make sure that everything is written in .dbf */ - if( !DBFFlushRecord( psDBF ) ) + if (!DBFFlushRecord(psDBF)) return FALSE; - chFieldFill = DBFGetNullCharacter(chType); + const char chFieldFill = DBFGetNullCharacter(chType); - chOldType = psDBF->pachFieldType[iField]; - nOffset = psDBF->panFieldOffset[iField]; - nOldWidth = psDBF->panFieldSize[iField]; - nOldRecordLength = psDBF->nRecordLength; + const char chOldType = psDBF->pachFieldType[iField]; + const int nOffset = psDBF->panFieldOffset[iField]; + const int nOldWidth = psDBF->panFieldSize[iField]; + const int nOldRecordLength = psDBF->nRecordLength; -/* -------------------------------------------------------------------- */ -/* Do some checking to ensure we can add records to this file. */ -/* -------------------------------------------------------------------- */ - if( nWidth < 1 ) + /* -------------------------------------------------------------------- */ + /* Do some checking to ensure we can add records to this file. */ + /* -------------------------------------------------------------------- */ + if (nWidth < 1) return -1; - if( nWidth > XBASE_FLD_MAX_WIDTH ) + if (nWidth > XBASE_FLD_MAX_WIDTH) nWidth = XBASE_FLD_MAX_WIDTH; -/* -------------------------------------------------------------------- */ -/* Assign the new field information fields. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Assign the new field information fields. */ + /* -------------------------------------------------------------------- */ psDBF->panFieldSize[iField] = nWidth; psDBF->panFieldDecimals[iField] = nDecimals; psDBF->pachFieldType[iField] = chType; -/* -------------------------------------------------------------------- */ -/* Update the header information. */ -/* -------------------------------------------------------------------- */ - pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * iField; + /* -------------------------------------------------------------------- */ + /* Update the header information. */ + /* -------------------------------------------------------------------- */ + char *pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * iField; - for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + for (int i = 0; i < XBASE_FLDHDR_SZ; i++) pszFInfo[i] = '\0'; - strncpy( pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE ); + strncpy(pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE); pszFInfo[11] = psDBF->pachFieldType[iField]; - if( chType == 'C' ) + if (chType == 'C') { pszFInfo[16] = STATIC_CAST(unsigned char, nWidth % 256); pszFInfo[17] = STATIC_CAST(unsigned char, nWidth / 256); @@ -2258,60 +2126,71 @@ DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, pszFInfo[17] = STATIC_CAST(unsigned char, nDecimals); } -/* -------------------------------------------------------------------- */ -/* Update offsets */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Update offsets */ + /* -------------------------------------------------------------------- */ if (nWidth != nOldWidth) { - for (i = iField + 1; i < psDBF->nFields; i++) - psDBF->panFieldOffset[i] += nWidth - nOldWidth; + for (int i = iField + 1; i < psDBF->nFields; i++) + psDBF->panFieldOffset[i] += nWidth - nOldWidth; psDBF->nRecordLength += nWidth - nOldWidth; - psDBF->pszCurrentRecord = STATIC_CAST(char *, SfRealloc(psDBF->pszCurrentRecord, - psDBF->nRecordLength)); + psDBF->pszCurrentRecord = STATIC_CAST( + char *, realloc(psDBF->pszCurrentRecord, psDBF->nRecordLength)); } /* we're done if we're dealing with not yet created .dbf */ - if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + if (psDBF->bNoHeader && psDBF->nRecords == 0) return TRUE; /* force update of header with new header and record length */ psDBF->bNoHeader = TRUE; - DBFUpdateHeader( psDBF ); + DBFUpdateHeader(psDBF); + + bool errorAbort = false; if (nWidth < nOldWidth || (nWidth == nOldWidth && chType != chOldType)) { - char* pszRecord = STATIC_CAST(char *, malloc(sizeof(char) * nOldRecordLength)); - char* pszOldField = STATIC_CAST(char *, malloc(sizeof(char) * (nOldWidth + 1))); + char *pszRecord = + STATIC_CAST(char *, malloc(sizeof(char) * nOldRecordLength)); + char *pszOldField = + STATIC_CAST(char *, malloc(sizeof(char) * (nOldWidth + 1))); - /* cppcheck-suppress uninitdata */ pszOldField[nOldWidth] = 0; /* move records to their new positions */ - for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + for (int iRecord = 0; iRecord < psDBF->nRecords; iRecord++) { - nRecordOffset = - nOldRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; + SAOffset nRecordOffset = + nOldRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; /* load record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + if (psDBF->sHooks.FRead(pszRecord, nOldRecordLength, 1, + psDBF->fp) != 1) + { + errorAbort = true; + break; + } memcpy(pszOldField, pszRecord + nOffset, nOldWidth); - bIsNULL = DBFIsValueNULL( chOldType, pszOldField ); + const bool bIsNULL = + DBFIsValueNULL(chOldType, pszOldField, nOldWidth); if (nWidth != nOldWidth) { - if ((chOldType == 'N' || chOldType == 'F' || chOldType == 'D') && pszOldField[0] == ' ') + if ((chOldType == 'N' || chOldType == 'F' || + chOldType == 'D') && + pszOldField[0] == ' ') { /* Strip leading spaces when truncating a numeric field */ - memmove( pszRecord + nOffset, - pszRecord + nOffset + nOldWidth - nWidth, - nWidth ); + memmove(pszRecord + nOffset, + pszRecord + nOffset + nOldWidth - nWidth, nWidth); } if (nOffset + nOldWidth < nOldRecordLength) { - memmove( pszRecord + nOffset + nWidth, + memmove(pszRecord + nOffset + nWidth, pszRecord + nOffset + nOldWidth, nOldRecordLength - (nOffset + nOldWidth)); } @@ -2320,26 +2199,28 @@ DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, /* Convert null value to the appropriate value of the new type */ if (bIsNULL) { - memset( pszRecord + nOffset, chFieldFill, nWidth); + memset(pszRecord + nOffset, chFieldFill, nWidth); } nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; + psDBF->nRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; /* write record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(pszRecord, psDBF->nRecordLength, 1, psDBF->fp); } - if( psDBF->bWriteEndOfFileChar ) + if (!errorAbort && psDBF->bWriteEndOfFileChar) { char ch = END_OF_FILE_CHARACTER; - nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,psDBF->nRecords) + psDBF->nHeaderLength; + SAOffset nRecordOffset = + psDBF->nRecordLength * STATIC_CAST(SAOffset, psDBF->nRecords) + + psDBF->nHeaderLength; - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(&ch, 1, 1, psDBF->fp); } /* TODO: truncate file */ @@ -2348,76 +2229,95 @@ DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, } else if (nWidth > nOldWidth) { - char* pszRecord = STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); - char* pszOldField = STATIC_CAST(char *, malloc(sizeof(char) * (nOldWidth + 1))); + char *pszRecord = + STATIC_CAST(char *, malloc(sizeof(char) * psDBF->nRecordLength)); + char *pszOldField = + STATIC_CAST(char *, malloc(sizeof(char) * (nOldWidth + 1))); - /* cppcheck-suppress uninitdata */ pszOldField[nOldWidth] = 0; /* move records to their new positions */ - for (iRecord = psDBF->nRecords - 1; iRecord >= 0; iRecord--) + for (int iRecord = psDBF->nRecords - 1; iRecord >= 0; iRecord--) { - nRecordOffset = - nOldRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; + SAOffset nRecordOffset = + nOldRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; /* load record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + if (psDBF->sHooks.FRead(pszRecord, nOldRecordLength, 1, + psDBF->fp) != 1) + { + errorAbort = true; + break; + } memcpy(pszOldField, pszRecord + nOffset, nOldWidth); - bIsNULL = DBFIsValueNULL( chOldType, pszOldField ); + const bool bIsNULL = + DBFIsValueNULL(chOldType, pszOldField, nOldWidth); if (nOffset + nOldWidth < nOldRecordLength) { - memmove( pszRecord + nOffset + nWidth, - pszRecord + nOffset + nOldWidth, - nOldRecordLength - (nOffset + nOldWidth)); + memmove(pszRecord + nOffset + nWidth, + pszRecord + nOffset + nOldWidth, + nOldRecordLength - (nOffset + nOldWidth)); } /* Convert null value to the appropriate value of the new type */ if (bIsNULL) { - memset( pszRecord + nOffset, chFieldFill, nWidth); + memset(pszRecord + nOffset, chFieldFill, nWidth); } else { if ((chOldType == 'N' || chOldType == 'F')) { /* Add leading spaces when expanding a numeric field */ - memmove( pszRecord + nOffset + nWidth - nOldWidth, - pszRecord + nOffset, nOldWidth ); - memset( pszRecord + nOffset, ' ', nWidth - nOldWidth ); + memmove(pszRecord + nOffset + nWidth - nOldWidth, + pszRecord + nOffset, nOldWidth); + memset(pszRecord + nOffset, ' ', nWidth - nOldWidth); } else { /* Add trailing spaces */ - memset(pszRecord + nOffset + nOldWidth, ' ', nWidth - nOldWidth); + memset(pszRecord + nOffset + nOldWidth, ' ', + nWidth - nOldWidth); } } nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,iRecord) + psDBF->nHeaderLength; + psDBF->nRecordLength * STATIC_CAST(SAOffset, iRecord) + + psDBF->nHeaderLength; /* write record */ - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(pszRecord, psDBF->nRecordLength, 1, psDBF->fp); } - if( psDBF->bWriteEndOfFileChar ) + if (!errorAbort && psDBF->bWriteEndOfFileChar) { char ch = END_OF_FILE_CHARACTER; - nRecordOffset = - psDBF->nRecordLength * STATIC_CAST(SAOffset,psDBF->nRecords) + psDBF->nHeaderLength; + SAOffset nRecordOffset = + psDBF->nRecordLength * STATIC_CAST(SAOffset, psDBF->nRecords) + + psDBF->nHeaderLength; - psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); - psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + psDBF->sHooks.FSeek(psDBF->fp, nRecordOffset, 0); + psDBF->sHooks.FWrite(&ch, 1, 1, psDBF->fp); } free(pszRecord); free(pszOldField); } + if (errorAbort) + { + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = FALSE; + + return FALSE; + } psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; psDBF->bUpdated = TRUE; @@ -2429,7 +2329,7 @@ DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, /* DBFSetWriteEndOfFileChar() */ /************************************************************************/ -void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ) +void SHPAPI_CALL DBFSetWriteEndOfFileChar(DBFHandle psDBF, int bWriteFlag) { psDBF->bWriteEndOfFileChar = bWriteFlag; } diff --git a/shapelib/safileio.c b/shapelib/safileio.c index d2c7f581c..2799f8112 100644 --- a/shapelib/safileio.c +++ b/shapelib/safileio.c @@ -1,5 +1,4 @@ /****************************************************************************** - * $Id: safileio.c,v 1.6 2018-06-15 19:56:32 erouault Exp $ * * Project: Shapelib * Purpose: Default implementation of file io based on stdio. @@ -7,224 +6,124 @@ * ****************************************************************************** * Copyright (c) 2007, Frank Warmerdam + * Copyright (c) 2016-2024, Even Rouault * - * This software is available under the following "MIT Style" license, - * or at the option of the licensee under the LGPL (see COPYING). This - * option is discussed in more detail in shapelib.html. - * - * -- - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * SPDX-License-Identifier: MIT OR LGPL-2.0-or-later ****************************************************************************** * - * $Log: safileio.c,v $ - * Revision 1.6 2018-06-15 19:56:32 erouault - * * safileio.c: remove duplicate test. Patch by Jaroslav Fojtik. - * Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2744 - * - * Revision 1.5 2016-12-05 12:44:05 erouault - * * Major overhaul of Makefile build system to use autoconf/automake. - * - * * Warning fixes in contrib/ - * - * Revision 1.4 2008-01-16 20:05:14 bram - * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks - * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this - * is only available on the Windows platform that decodes the UTF-8 filenames to wide - * character strings and feeds them to _wfopen and _wremove. - * - * Revision 1.3 2007/12/18 18:28:11 bram - * - create hook for client specific atof (bugzilla ticket 1615) - * - check for NULL handle before closing cpCPG file, and close after reading. - * - * Revision 1.2 2007/12/15 20:25:30 bram - * dbfopen.c now reads the Code Page information from the DBF file, and exports - * this information as a string through the DBFGetCodePage function. This is - * either the number from the LDID header field ("LDID/") or as the - * content of an accompanying .CPG file. When creating a DBF file, the code can - * be set using DBFCreateEx. - * - * Revision 1.1 2007/12/06 06:56:41 fwarmerdam - * new - * */ #include "shapefil.h" +#include #include #include -#include +#include #include #include -#include - -SHP_CVSID("$Id: safileio.c,v 1.6 2018-06-15 19:56:32 erouault Exp $"); #ifdef SHPAPI_UTF8_HOOKS -# ifdef SHPAPI_WINDOWS -# define WIN32_LEAN_AND_MEAN -# define NOMINMAX -# include -# pragma comment(lib, "kernel32.lib") -# endif +#ifdef SHPAPI_WINDOWS +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#pragma comment(lib, "kernel32.lib") +#endif #endif -/************************************************************************/ -/* SADFOpen() */ -/************************************************************************/ - -SAFile SADFOpen( const char *pszFilename, const char *pszAccess ) - +static SAFile SADFOpen(const char *pszFilename, const char *pszAccess, + void *pvUserData) { - return (SAFile) fopen( pszFilename, pszAccess ); + (void)pvUserData; + return (SAFile)fopen(pszFilename, pszAccess); } -/************************************************************************/ -/* SADFRead() */ -/************************************************************************/ - -SAOffset SADFRead( void *p, SAOffset size, SAOffset nmemb, SAFile file ) - +static SAOffset SADFRead(void *p, SAOffset size, SAOffset nmemb, SAFile file) { - return (SAOffset) fread( p, (size_t) size, (size_t) nmemb, - (FILE *) file ); + return (SAOffset)fread(p, (size_t)size, (size_t)nmemb, (FILE *)file); } -/************************************************************************/ -/* SADFWrite() */ -/************************************************************************/ - -SAOffset SADFWrite( void *p, SAOffset size, SAOffset nmemb, SAFile file ) - +static SAOffset SADFWrite(const void *p, SAOffset size, SAOffset nmemb, + SAFile file) { - return (SAOffset) fwrite( p, (size_t) size, (size_t) nmemb, - (FILE *) file ); + return (SAOffset)fwrite(p, (size_t)size, (size_t)nmemb, (FILE *)file); } -/************************************************************************/ -/* SADFSeek() */ -/************************************************************************/ - -SAOffset SADFSeek( SAFile file, SAOffset offset, int whence ) - +static SAOffset SADFSeek(SAFile file, SAOffset offset, int whence) { - return (SAOffset) fseek( (FILE *) file, (long) offset, whence ); +#if defined(_MSC_VER) && _MSC_VER >= 1400 + return (SAOffset)_fseeki64((FILE *)file, (__int64)offset, whence); +#else + return (SAOffset)fseek((FILE *)file, (long)offset, whence); +#endif } -/************************************************************************/ -/* SADFTell() */ -/************************************************************************/ - -SAOffset SADFTell( SAFile file ) - +static SAOffset SADFTell(SAFile file) { - return (SAOffset) ftell( (FILE *) file ); +#if defined(_MSC_VER) && _MSC_VER >= 1400 + return (SAOffset)_ftelli64((FILE *)file); +#else + return (SAOffset)ftell((FILE *)file); +#endif } -/************************************************************************/ -/* SADFFlush() */ -/************************************************************************/ - -int SADFFlush( SAFile file ) - +static int SADFFlush(SAFile file) { - return fflush( (FILE *) file ); + return fflush((FILE *)file); } -/************************************************************************/ -/* SADFClose() */ -/************************************************************************/ - -int SADFClose( SAFile file ) - +static int SADFClose(SAFile file) { - return fclose( (FILE *) file ); + return fclose((FILE *)file); } -/************************************************************************/ -/* SADFClose() */ -/************************************************************************/ - -int SADRemove( const char *filename ) - +static int SADRemove(const char *filename, void *pvUserData) { - return remove( filename ); + (void)pvUserData; + return remove(filename); } -/************************************************************************/ -/* SADError() */ -/************************************************************************/ - -void SADError( const char *message ) - +static void SADError(const char *message) { - fprintf( stderr, "%s\n", message ); + fprintf(stderr, "%s\n", message); } -/************************************************************************/ -/* SASetupDefaultHooks() */ -/************************************************************************/ - -void SASetupDefaultHooks( SAHooks *psHooks ) - +void SASetupDefaultHooks(SAHooks *psHooks) { - psHooks->FOpen = SADFOpen; - psHooks->FRead = SADFRead; - psHooks->FWrite = SADFWrite; - psHooks->FSeek = SADFSeek; - psHooks->FTell = SADFTell; - psHooks->FFlush = SADFFlush; - psHooks->FClose = SADFClose; - psHooks->Remove = SADRemove; - - psHooks->Error = SADError; - psHooks->Atof = atof; + psHooks->FOpen = SADFOpen; + psHooks->FRead = SADFRead; + psHooks->FWrite = SADFWrite; + psHooks->FSeek = SADFSeek; + psHooks->FTell = SADFTell; + psHooks->FFlush = SADFFlush; + psHooks->FClose = SADFClose; + psHooks->Remove = SADRemove; + + psHooks->Error = SADError; + psHooks->Atof = atof; + psHooks->pvUserData = NULL; } - - - #ifdef SHPAPI_WINDOWS -/************************************************************************/ -/* Utf8ToWideChar */ -/************************************************************************/ - -const wchar_t* Utf8ToWideChar( const char *pszFilename ) +static wchar_t *Utf8ToWideChar(const char *pszFilename) { - int nMulti, nWide; - wchar_t *pwszFileName; - - nMulti = strlen(pszFilename) + 1; - nWide = MultiByteToWideChar( CP_UTF8, 0, pszFilename, nMulti, 0, 0); - if( nWide == 0 ) + const int nMulti = (int)strlen(pszFilename) + 1; + const int nWide = + MultiByteToWideChar(CP_UTF8, 0, pszFilename, nMulti, 0, 0); + if (nWide == 0) { return NULL; } - pwszFileName = (wchar_t*) malloc(nWide * sizeof(wchar_t)); - if ( pwszFileName == NULL ) + wchar_t *pwszFileName = (wchar_t *)malloc(nWide * sizeof(wchar_t)); + if (pwszFileName == NULL) { return NULL; } - if( MultiByteToWideChar( CP_UTF8, 0, pszFilename, nMulti, pwszFileName, nWide ) == 0 ) + if (MultiByteToWideChar(CP_UTF8, 0, pszFilename, nMulti, pwszFileName, + nWide) == 0) { - free( pwszFileName ); + free(pwszFileName); return NULL; } return pwszFileName; @@ -234,62 +133,54 @@ const wchar_t* Utf8ToWideChar( const char *pszFilename ) /* SAUtf8WFOpen */ /************************************************************************/ -SAFile SAUtf8WFOpen( const char *pszFilename, const char *pszAccess ) +static SAFile SAUtf8WFOpen(const char *pszFilename, const char *pszAccess, + void *pvUserData) { + (void)pvUserData; SAFile file = NULL; - const wchar_t *pwszFileName, *pwszAccess; - pwszFileName = Utf8ToWideChar( pszFilename ); - pwszAccess = Utf8ToWideChar( pszAccess ); - if( pwszFileName != NULL && pwszAccess != NULL) + wchar_t *pwszFileName = Utf8ToWideChar(pszFilename); + wchar_t *pwszAccess = Utf8ToWideChar(pszAccess); + if (pwszFileName != NULL && pwszAccess != NULL) { - file = (SAFile) _wfopen( pwszFileName, pwszAccess ); + file = (SAFile)_wfopen(pwszFileName, pwszAccess); } - free ((wchar_t*) pwszFileName); - free ((wchar_t*) pwszAccess); + free(pwszFileName); + free(pwszAccess); return file; } -/************************************************************************/ -/* SAUtf8WRemove() */ -/************************************************************************/ - -int SAUtf8WRemove( const char *pszFilename ) +static int SAUtf8WRemove(const char *pszFilename, void *pvUserData) { - const wchar_t *pwszFileName = Utf8ToWideChar( pszFilename ); - int rc = -1; - if( pwszFileName != NULL ) + (void)pvUserData; + wchar_t *pwszFileName = Utf8ToWideChar(pszFilename); + int rc = -1; + if (pwszFileName != NULL) { - rc = _wremove( pwszFileName ); + rc = _wremove(pwszFileName); } - free ((wchar_t*) pwszFileName); + free(pwszFileName); return rc; } #endif #ifdef SHPAPI_UTF8_HOOKS - -/************************************************************************/ -/* SASetupUtf8Hooks() */ -/************************************************************************/ - -void SASetupUtf8Hooks( SAHooks *psHooks ) -{ -#ifdef SHPAPI_WINDOWS - psHooks->FOpen = SAUtf8WFOpen; - psHooks->Remove = SAUtf8WRemove; -#else -# error "no implementations of UTF-8 hooks available for this platform" +#ifndef SHPAPI_WINDOWS +#error "no implementations of UTF-8 hooks available for this platform" #endif - psHooks->FRead = SADFRead; - psHooks->FWrite = SADFWrite; - psHooks->FSeek = SADFSeek; - psHooks->FTell = SADFTell; - psHooks->FFlush = SADFFlush; - psHooks->FClose = SADFClose; - psHooks->Error = SADError; - psHooks->Atof = atof; +void SASetupUtf8Hooks(SAHooks *psHooks) +{ + psHooks->FOpen = SAUtf8WFOpen; + psHooks->Remove = SAUtf8WRemove; + psHooks->FRead = SADFRead; + psHooks->FWrite = SADFWrite; + psHooks->FSeek = SADFSeek; + psHooks->FTell = SADFTell; + psHooks->FFlush = SADFFlush; + psHooks->FClose = SADFClose; + + psHooks->Error = SADError; + psHooks->Atof = atof; } - #endif diff --git a/shapelib/shapefil.h b/shapelib/shapefil.h index 199964d42..47b2e30fd 100644 --- a/shapelib/shapefil.h +++ b/shapelib/shapefil.h @@ -2,7 +2,6 @@ #define SHAPEFILE_H_INCLUDED /****************************************************************************** - * $Id: shapefil.h,v 1.56 2018-08-16 15:39:07 erouault Exp $ * * Project: Shapelib * Purpose: Primary include file for Shapelib. @@ -10,185 +9,44 @@ * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam - * Copyright (c) 2012-2016, Even Rouault + * Copyright (c) 2012-2024, Even Rouault * - * This software is available under the following "MIT Style" license, - * or at the option of the licensee under the LGPL (see COPYING). This - * option is discussed in more detail in shapelib.html. - * - * -- - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * SPDX-License-Identifier: MIT OR LGPL-2.0-or-later ****************************************************************************** * - * $Log: shapefil.h,v $ - * Revision 1.56 2018-08-16 15:39:07 erouault - * * shpopen.c, dbfopen.c, shptree.c, sbnsearch.c: resyc with GDAL - * internal shapelib. Mostly to allow building those files as C++ - * without warning. Also add FTDate entry in DBFFieldType - * (see https://github.com/OSGeo/gdal/pull/308). And some other - * code cleanups - * - * Revision 1.55 2016-12-05 18:44:08 erouault - * * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. - * This behaviour can be controlled with the DBFSetWriteEndOfFileChar() - * function. - * - * Revision 1.54 2016-12-05 12:44:05 erouault - * * Major overhaul of Makefile build system to use autoconf/automake. - * - * * Warning fixes in contrib/ - * - * Revision 1.53 2016-12-04 15:30:15 erouault - * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with - * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo - * structures extended with new members. New functions: - * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, - * SHPSetFastModeReadObject - * - * * sbnsearch.c: new file to implement original ESRI .sbn spatial - * index reading. (no write support). New functions: - * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, - * SBNSearchDiskTreeInteger, SBNSearchFreeIds - * - * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates - * with new file and symbols. - * - * * commit: helper script to cvs commit - * - * Revision 1.52 2011-12-11 22:26:46 fwarmerdam - * upgrade .qix access code to use SAHooks (gdal #3365) - * - * Revision 1.51 2011-07-24 05:59:25 fwarmerdam - * minimize use of CPLError in favor of SAHooks.Error() - * - * Revision 1.50 2011-05-13 17:35:17 fwarmerdam - * added DBFReorderFields() and DBFAlterFields() functions (from Even) - * - * Revision 1.49 2011-04-16 14:38:21 fwarmerdam - * avoid warnings with gcc on SHP_CVSID - * - * Revision 1.48 2010-08-27 23:42:52 fwarmerdam - * add SHPAPI_CALL attribute in code - * - * Revision 1.47 2010-01-28 11:34:34 fwarmerdam - * handle the shape file length limits more gracefully (#3236) - * - * Revision 1.46 2008-11-12 14:28:15 fwarmerdam - * DBFCreateField() now works on files with records - * - * Revision 1.45 2008/11/11 17:47:10 fwarmerdam - * added DBFDeleteField() function - * - * Revision 1.44 2008/01/16 20:05:19 bram - * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks - * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this - * is only available on the Windows platform that decodes the UTF-8 filenames to wide - * character strings and feeds them to _wfopen and _wremove. - * - * Revision 1.43 2008/01/10 16:35:30 fwarmerdam - * avoid _ prefix on #defined symbols (bug 1840) - * - * Revision 1.42 2007/12/18 18:28:14 bram - * - create hook for client specific atof (bugzilla ticket 1615) - * - check for NULL handle before closing cpCPG file, and close after reading. - * - * Revision 1.41 2007/12/15 20:25:32 bram - * dbfopen.c now reads the Code Page information from the DBF file, and exports - * this information as a string through the DBFGetCodePage function. This is - * either the number from the LDID header field ("LDID/") or as the - * content of an accompanying .CPG file. When creating a DBF file, the code can - * be set using DBFCreateEx. - * - * Revision 1.40 2007/12/06 07:00:25 fwarmerdam - * dbfopen now using SAHooks for fileio - * - * Revision 1.39 2007/12/04 20:37:56 fwarmerdam - * preliminary implementation of hooks api for io and errors - * - * Revision 1.38 2007/11/21 22:39:56 fwarmerdam - * close shx file in readonly mode (GDAL #1956) - * - * Revision 1.37 2007/10/27 03:31:14 fwarmerdam - * limit default depth of tree to 12 levels (gdal ticket #1594) - * - * Revision 1.36 2007/09/10 23:33:15 fwarmerdam - * Upstreamed support for visibility flag in SHPAPI_CALL for the needs - * of GDAL (gdal ticket #1810). - * - * Revision 1.35 2007/09/03 19:48:10 fwarmerdam - * move DBFReadAttribute() static dDoubleField into dbfinfo - * - * Revision 1.34 2006/06/17 15:33:32 fwarmerdam - * added pszWorkField - bug 1202 (rso) - * - * Revision 1.33 2006/02/15 01:14:30 fwarmerdam - * added DBFAddNativeFieldType - * - * Revision 1.32 2006/01/26 15:07:32 fwarmerdam - * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 - * - * Revision 1.31 2006/01/05 01:27:27 fwarmerdam - * added dbf deletion mark/fetch - * - * Revision 1.30 2005/01/03 22:30:13 fwarmerdam - * added support for saved quadtrees - * - * Revision 1.29 2004/09/26 20:09:35 fwarmerdam - * avoid rcsid warnings - * - * Revision 1.28 2003/12/29 06:02:18 fwarmerdam - * added cpl_error.h option - * - * Revision 1.27 2003/04/21 18:30:37 warmerda - * added header write/update public methods - * - * Revision 1.26 2002/09/29 00:00:08 warmerda - * added FTLogical and logical attribute read/write calls - * - * Revision 1.25 2002/05/07 13:46:30 warmerda - * added DBFWriteAttributeDirectly(). - * - * Revision 1.24 2002/04/10 16:59:54 warmerda - * added SHPRewindObject - * - * Revision 1.23 2002/01/15 14:36:07 warmerda - * updated email address - * - * Revision 1.22 2002/01/15 14:32:00 warmerda - * try to improve SHPAPI_CALL docs */ #include -#ifdef USE_DBMALLOC -#include -#endif - #ifdef USE_CPL #include "cpl_conv.h" #endif #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif + /************************************************************************/ + /* Version related macros (added in 1.6.0) */ + /************************************************************************/ + +#define SHAPELIB_VERSION_MAJOR 1 +#define SHAPELIB_VERSION_MINOR 6 +#define SHAPELIB_VERSION_MICRO 1 + +#define SHAPELIB_MAKE_VERSION_NUMBER(major, minor, micro) \ + ((major) * 10000 + (minor) * 100 + (micro)) + +#define SHAPELIB_VERSION_NUMBER \ + SHAPELIB_MAKE_VERSION_NUMBER(SHAPELIB_VERSION_MAJOR, \ + SHAPELIB_VERSION_MINOR, \ + SHAPELIB_VERSION_MICRO) + +#define SHAPELIB_AT_LEAST(major, minor, micro) \ + (SHAPELIB_VERSION_NUMBER >= \ + SHAPELIB_MAKE_VERSION_NUMBER(major, minor, micro)) + /************************************************************************/ /* Configuration options. */ /************************************************************************/ @@ -206,271 +64,260 @@ extern "C" { /* -------------------------------------------------------------------- */ #define DISABLE_MULTIPATCH_MEASURE -/* -------------------------------------------------------------------- */ -/* SHPAPI_CALL */ -/* */ -/* The following two macros are present to allow forcing */ -/* various calling conventions on the Shapelib API. */ -/* */ -/* To force __stdcall conventions (needed to call Shapelib */ -/* from Visual Basic and/or Dephi I believe) the makefile could */ -/* be modified to define: */ -/* */ -/* /DSHPAPI_CALL=__stdcall */ -/* */ -/* If it is desired to force export of the Shapelib API without */ -/* using the shapelib.def file, use the following definition. */ -/* */ -/* /DSHAPELIB_DLLEXPORT */ -/* */ -/* To get both at once it will be necessary to hack this */ -/* include file to define: */ -/* */ -/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ -/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ -/* */ -/* The complexity of the situation is partly caused by the */ -/* peculiar requirement of Visual C++ that __stdcall appear */ -/* after any "*"'s in the return value of a function while the */ -/* __declspec(dllexport) must appear before them. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* SHPAPI_CALL */ + /* */ + /* The following two macros are present to allow forcing */ + /* various calling conventions on the Shapelib API. */ + /* */ + /* To force __stdcall conventions (needed to call Shapelib */ + /* from Visual Basic and/or Delphi I believe) the makefile could */ + /* be modified to define: */ + /* */ + /* /DSHPAPI_CALL=__stdcall */ + /* */ + /* If it is desired to force export of the Shapelib API without */ + /* using the shapelib.def file, use the following definition. */ + /* */ + /* /DSHAPELIB_DLLEXPORT */ + /* */ + /* To get both at once it will be necessary to hack this */ + /* include file to define: */ + /* */ + /* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ + /* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ + /* */ + /* The complexity of the situation is partly caused by the */ + /* peculiar requirement of Visual C++ that __stdcall appear */ + /* after any "*"'s in the return value of a function while the */ + /* __declspec(dllexport) must appear before them. */ + /* -------------------------------------------------------------------- */ #ifdef SHAPELIB_DLLEXPORT -# define SHPAPI_CALL __declspec(dllexport) -# define SHPAPI_CALL1(x) __declspec(dllexport) x +#define SHPAPI_CALL __declspec(dllexport) +#define SHPAPI_CALL1(x) __declspec(dllexport) x #endif #ifndef SHPAPI_CALL -# if defined(USE_GCC_VISIBILITY_FLAG) -# define SHPAPI_CALL __attribute__ ((visibility("default"))) -# define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x -# else -# define SHPAPI_CALL -# endif +#if defined(USE_GCC_VISIBILITY_FLAG) +#define SHPAPI_CALL __attribute__((visibility("default"))) +#define SHPAPI_CALL1(x) __attribute__((visibility("default"))) x +#else +#define SHPAPI_CALL #endif - -#ifndef SHPAPI_CALL1 -# define SHPAPI_CALL1(x) x SHPAPI_CALL #endif -/* -------------------------------------------------------------------- */ -/* Macros for controlling CVSID and ensuring they don't appear */ -/* as unreferenced variables resulting in lots of warnings. */ -/* -------------------------------------------------------------------- */ -#ifndef DISABLE_CVSID -# if defined(__GNUC__) && __GNUC__ >= 4 -# define SHP_CVSID(string) static const char cpl_cvsid[] __attribute__((used)) = string; -# else -# define SHP_CVSID(string) static const char cpl_cvsid[] = string; \ -static const char *cvsid_aw() { return( cvsid_aw() ? NULL : cpl_cvsid ); } -# endif -#else -# define SHP_CVSID(string) +#ifndef SHPAPI_CALL1 +#define SHPAPI_CALL1(x) x SHPAPI_CALL #endif /* -------------------------------------------------------------------- */ /* On some platforms, additional file IO hooks are defined that */ /* UTF-8 encoded filenames Unicode filenames */ /* -------------------------------------------------------------------- */ -#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define SHPAPI_WINDOWS -# define SHPAPI_UTF8_HOOKS +#if defined(_WIN32) +#define SHPAPI_WINDOWS +#define SHPAPI_UTF8_HOOKS #endif -/* -------------------------------------------------------------------- */ -/* IO/Error hook functions. */ -/* -------------------------------------------------------------------- */ -typedef int *SAFile; + /* -------------------------------------------------------------------- */ + /* IO/Error hook functions. */ + /* -------------------------------------------------------------------- */ + typedef int *SAFile; #ifndef SAOffset -typedef unsigned long SAOffset; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + typedef unsigned __int64 SAOffset; +#else + typedef unsigned long SAOffset; +#endif #endif -typedef struct { - SAFile (*FOpen) ( const char *filename, const char *access); - SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); - SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); - SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); - SAOffset (*FTell) ( SAFile file ); - int (*FFlush)( SAFile file ); - int (*FClose)( SAFile file ); - int (*Remove) ( const char *filename ); - - void (*Error) ( const char *message ); - double (*Atof) ( const char *str ); -} SAHooks; - -void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); + typedef struct + { + SAFile (*FOpen)(const char *filename, const char *access, + void *pvUserData); + SAOffset (*FRead)(void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FWrite)(const void *p, SAOffset size, SAOffset nmemb, + SAFile file); + SAOffset (*FSeek)(SAFile file, SAOffset offset, int whence); + SAOffset (*FTell)(SAFile file); + int (*FFlush)(SAFile file); + int (*FClose)(SAFile file); + int (*Remove)(const char *filename, void *pvUserData); + + void (*Error)(const char *message); + double (*Atof)(const char *str); + void *pvUserData; + } SAHooks; + + void SHPAPI_CALL SASetupDefaultHooks(SAHooks *psHooks); #ifdef SHPAPI_UTF8_HOOKS -void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); + void SHPAPI_CALL SASetupUtf8Hooks(SAHooks *psHooks); #endif -/************************************************************************/ -/* SHP Support. */ -/************************************************************************/ -typedef struct tagSHPObject SHPObject; + /************************************************************************/ + /* SHP Support. */ + /************************************************************************/ + typedef struct tagSHPObject SHPObject; -typedef struct -{ - SAHooks sHooks; + typedef struct + { + SAHooks sHooks; + + SAFile fpSHP; + SAFile fpSHX; - SAFile fpSHP; - SAFile fpSHX; + int nShapeType; /* SHPT_* */ - int nShapeType; /* SHPT_* */ + unsigned int nFileSize; /* SHP file */ - unsigned int nFileSize; /* SHP file */ + int nRecords; + int nMaxRecords; + unsigned int *panRecOffset; + unsigned int *panRecSize; - int nRecords; - int nMaxRecords; - unsigned int*panRecOffset; - unsigned int *panRecSize; + double adBoundsMin[4]; + double adBoundsMax[4]; - double adBoundsMin[4]; - double adBoundsMax[4]; + int bUpdated; - int bUpdated; + unsigned char *pabyRec; + int nBufSize; - unsigned char *pabyRec; - int nBufSize; + int bFastModeReadObject; + unsigned char *pabyObjectBuf; + int nObjectBufSize; + SHPObject *psCachedObject; + } SHPInfo; - int bFastModeReadObject; - unsigned char *pabyObjectBuf; - int nObjectBufSize; - SHPObject* psCachedObject; -} SHPInfo; + typedef SHPInfo *SHPHandle; -typedef SHPInfo * SHPHandle; + typedef struct + { + int year; + int month; + int day; + } SHPDate; /* -------------------------------------------------------------------- */ /* Shape types (nSHPType) */ /* -------------------------------------------------------------------- */ -#define SHPT_NULL 0 -#define SHPT_POINT 1 -#define SHPT_ARC 3 -#define SHPT_POLYGON 5 +#define SHPT_NULL 0 +#define SHPT_POINT 1 +#define SHPT_ARC 3 +#define SHPT_POLYGON 5 #define SHPT_MULTIPOINT 8 -#define SHPT_POINTZ 11 -#define SHPT_ARCZ 13 -#define SHPT_POLYGONZ 15 +#define SHPT_POINTZ 11 +#define SHPT_ARCZ 13 +#define SHPT_POLYGONZ 15 #define SHPT_MULTIPOINTZ 18 -#define SHPT_POINTM 21 -#define SHPT_ARCM 23 -#define SHPT_POLYGONM 25 +#define SHPT_POINTM 21 +#define SHPT_ARCM 23 +#define SHPT_POLYGONM 25 #define SHPT_MULTIPOINTM 28 #define SHPT_MULTIPATCH 31 -/* -------------------------------------------------------------------- */ -/* Part types - everything but SHPT_MULTIPATCH just uses */ -/* SHPP_RING. */ -/* -------------------------------------------------------------------- */ - -#define SHPP_TRISTRIP 0 -#define SHPP_TRIFAN 1 -#define SHPP_OUTERRING 2 -#define SHPP_INNERRING 3 -#define SHPP_FIRSTRING 4 -#define SHPP_RING 5 - -/* -------------------------------------------------------------------- */ -/* SHPObject - represents on shape (without attributes) read */ -/* from the .shp file. */ -/* -------------------------------------------------------------------- */ -struct tagSHPObject -{ - int nSHPType; - - int nShapeId; /* -1 is unknown/unassigned */ - - int nParts; - int *panPartStart; - int *panPartType; - - int nVertices; - double *padfX; - double *padfY; - double *padfZ; - double *padfM; - - double dfXMin; - double dfYMin; - double dfZMin; - double dfMMin; - - double dfXMax; - double dfYMax; - double dfZMax; - double dfMMax; - - int bMeasureIsUsed; - int bFastModeReadObject; -}; - -/* -------------------------------------------------------------------- */ -/* SHP API Prototypes */ -/* -------------------------------------------------------------------- */ - -/* If pszAccess is read-only, the fpSHX field of the returned structure */ -/* will be NULL as it is not necessary to keep the SHX file open */ -SHPHandle SHPAPI_CALL - SHPOpen( const char * pszShapeFile, const char * pszAccess ); -SHPHandle SHPAPI_CALL - SHPOpenLL( const char *pszShapeFile, const char *pszAccess, - SAHooks *psHooks ); -SHPHandle SHPAPI_CALL - SHPOpenLLEx( const char *pszShapeFile, const char *pszAccess, - SAHooks *psHooks, int bRestoreSHX ); - -int SHPAPI_CALL - SHPRestoreSHX( const char *pszShapeFile, const char *pszAccess, - SAHooks *psHooks ); - -/* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ -/* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ -/* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ -/* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ -void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ); - -SHPHandle SHPAPI_CALL - SHPCreate( const char * pszShapeFile, int nShapeType ); -SHPHandle SHPAPI_CALL - SHPCreateLL( const char * pszShapeFile, int nShapeType, - SAHooks *psHooks ); -void SHPAPI_CALL - SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, - double * padfMinBound, double * padfMaxBound ); - -SHPObject SHPAPI_CALL1(*) - SHPReadObject( SHPHandle hSHP, int iShape ); -int SHPAPI_CALL - SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); - -void SHPAPI_CALL - SHPDestroyObject( SHPObject * psObject ); -void SHPAPI_CALL - SHPComputeExtents( SHPObject * psObject ); -SHPObject SHPAPI_CALL1(*) - SHPCreateObject( int nSHPType, int nShapeId, int nParts, - const int * panPartStart, const int * panPartType, - int nVertices, - const double * padfX, const double * padfY, - const double * padfZ, const double * padfM ); -SHPObject SHPAPI_CALL1(*) - SHPCreateSimpleObject( int nSHPType, int nVertices, - const double * padfX, - const double * padfY, - const double * padfZ ); - -int SHPAPI_CALL - SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); - -void SHPAPI_CALL SHPClose( SHPHandle hSHP ); -void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); - -const char SHPAPI_CALL1(*) - SHPTypeName( int nSHPType ); -const char SHPAPI_CALL1(*) - SHPPartTypeName( int nPartType ); + /* -------------------------------------------------------------------- */ + /* Part types - everything but SHPT_MULTIPATCH just uses */ + /* SHPP_RING. */ + /* -------------------------------------------------------------------- */ + +#define SHPP_TRISTRIP 0 +#define SHPP_TRIFAN 1 +#define SHPP_OUTERRING 2 +#define SHPP_INNERRING 3 +#define SHPP_FIRSTRING 4 +#define SHPP_RING 5 + + /* -------------------------------------------------------------------- */ + /* SHPObject - represents one shape (without attributes) read */ + /* from the .shp file. */ + /* -------------------------------------------------------------------- */ + struct tagSHPObject + { + int nSHPType; + + int nShapeId; /* -1 is unknown/unassigned */ + + int nParts; + int *panPartStart; + int *panPartType; + + int nVertices; + double *padfX; + double *padfY; + double *padfZ; + double *padfM; + + double dfXMin; + double dfYMin; + double dfZMin; + double dfMMin; + + double dfXMax; + double dfYMax; + double dfZMax; + double dfMMax; + + int bMeasureIsUsed; + int bFastModeReadObject; + }; + + /* -------------------------------------------------------------------- */ + /* SHP API Prototypes */ + /* -------------------------------------------------------------------- */ + + /* If pszAccess is read-only, the fpSHX field of the returned structure */ + /* will be NULL as it is not necessary to keep the SHX file open */ + SHPHandle SHPAPI_CALL SHPOpen(const char *pszShapeFile, + const char *pszAccess); + SHPHandle SHPAPI_CALL SHPOpenLL(const char *pszShapeFile, + const char *pszAccess, + const SAHooks *psHooks); + SHPHandle SHPAPI_CALL SHPOpenLLEx(const char *pszShapeFile, + const char *pszAccess, + const SAHooks *psHooks, int bRestoreSHX); + + int SHPAPI_CALL SHPRestoreSHX(const char *pszShapeFile, + const char *pszAccess, + const SAHooks *psHooks); + + /* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ + /* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ + /* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ + /* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ + void SHPAPI_CALL SHPSetFastModeReadObject(SHPHandle hSHP, int bFastMode); + + SHPHandle SHPAPI_CALL SHPCreate(const char *pszShapeFile, int nShapeType); + SHPHandle SHPAPI_CALL SHPCreateLL(const char *pszShapeFile, int nShapeType, + const SAHooks *psHooks); + void SHPAPI_CALL SHPGetInfo(const SHPHandle hSHP, int *pnEntities, + int *pnShapeType, double *padfMinBound, + double *padfMaxBound); + + SHPObject SHPAPI_CALL1(*) SHPReadObject(const SHPHandle hSHP, int iShape); + int SHPAPI_CALL SHPWriteObject(SHPHandle hSHP, int iShape, + const SHPObject *psObject); + + void SHPAPI_CALL SHPDestroyObject(SHPObject *psObject); + void SHPAPI_CALL SHPComputeExtents(SHPObject *psObject); + SHPObject SHPAPI_CALL1(*) + SHPCreateObject(int nSHPType, int nShapeId, int nParts, + const int *panPartStart, const int *panPartType, + int nVertices, const double *padfX, const double *padfY, + const double *padfZ, const double *padfM); + SHPObject SHPAPI_CALL1(*) + SHPCreateSimpleObject(int nSHPType, int nVertices, const double *padfX, + const double *padfY, const double *padfZ); + + int SHPAPI_CALL SHPRewindObject(const SHPHandle hSHP, SHPObject *psObject); + + void SHPAPI_CALL SHPClose(SHPHandle hSHP); + void SHPAPI_CALL SHPWriteHeader(SHPHandle hSHP); + + const char SHPAPI_CALL1(*) SHPTypeName(int nSHPType); + const char SHPAPI_CALL1(*) SHPPartTypeName(int nPartType); /* -------------------------------------------------------------------- */ /* Shape quadtree indexing API. */ @@ -482,271 +329,253 @@ const char SHPAPI_CALL1(*) /* upper limit of tree levels for automatic estimation */ #define MAX_DEFAULT_TREE_DEPTH 12 -typedef struct shape_tree_node -{ - /* region covered by this node */ - double adfBoundsMin[4]; - double adfBoundsMax[4]; + typedef struct shape_tree_node + { + /* region covered by this node */ + double adfBoundsMin[4]; + double adfBoundsMax[4]; - /* list of shapes stored at this node. The papsShapeObj pointers - or the whole list can be NULL */ - int nShapeCount; - int *panShapeIds; - SHPObject **papsShapeObj; + /* list of shapes stored at this node. The papsShapeObj pointers + or the whole list can be NULL */ + int nShapeCount; + int *panShapeIds; + SHPObject **papsShapeObj; - int nSubNodes; - struct shape_tree_node *apsSubNode[MAX_SUBNODE]; + int nSubNodes; + struct shape_tree_node *apsSubNode[MAX_SUBNODE]; -} SHPTreeNode; + } SHPTreeNode; -typedef struct -{ - SHPHandle hSHP; + typedef struct + { + SHPHandle hSHP; - int nMaxDepth; - int nDimension; - int nTotalCount; + int nMaxDepth; + int nDimension; + int nTotalCount; - SHPTreeNode *psRoot; -} SHPTree; + SHPTreeNode *psRoot; + } SHPTree; -SHPTree SHPAPI_CALL1(*) - SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, - double *padfBoundsMin, double *padfBoundsMax ); -void SHPAPI_CALL - SHPDestroyTree( SHPTree * hTree ); + SHPTree SHPAPI_CALL1(*) + SHPCreateTree(SHPHandle hSHP, int nDimension, int nMaxDepth, + const double *padfBoundsMin, const double *padfBoundsMax); + void SHPAPI_CALL SHPDestroyTree(SHPTree *hTree); -int SHPAPI_CALL - SHPWriteTree( SHPTree *hTree, const char * pszFilename ); + int SHPAPI_CALL SHPWriteTree(SHPTree *hTree, const char *pszFilename); -int SHPAPI_CALL - SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); -int SHPAPI_CALL - SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); + int SHPAPI_CALL SHPTreeAddShapeId(SHPTree *hTree, SHPObject *psObject); -void SHPAPI_CALL - SHPTreeTrimExtraNodes( SHPTree * hTree ); + void SHPAPI_CALL SHPTreeTrimExtraNodes(SHPTree *hTree); -int SHPAPI_CALL1(*) - SHPTreeFindLikelyShapes( SHPTree * hTree, - double * padfBoundsMin, - double * padfBoundsMax, - int * ); -int SHPAPI_CALL - SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); + int SHPAPI_CALL1(*) + SHPTreeFindLikelyShapes(const SHPTree *hTree, double *padfBoundsMin, + double *padfBoundsMax, int *); + int SHPAPI_CALL SHPCheckBoundsOverlap(const double *, const double *, + const double *, const double *, int); -int SHPAPI_CALL1(*) -SHPSearchDiskTree( FILE *fp, - double *padfBoundsMin, double *padfBoundsMax, - int *pnShapeCount ); + int SHPAPI_CALL1(*) + SHPSearchDiskTree(FILE *fp, double *padfBoundsMin, + double *padfBoundsMax, int *pnShapeCount); -typedef struct SHPDiskTreeInfo* SHPTreeDiskHandle; + typedef struct SHPDiskTreeInfo *SHPTreeDiskHandle; -SHPTreeDiskHandle SHPAPI_CALL - SHPOpenDiskTree( const char* pszQIXFilename, - SAHooks *psHooks ); + SHPTreeDiskHandle SHPAPI_CALL SHPOpenDiskTree(const char *pszQIXFilename, + const SAHooks *psHooks); -void SHPAPI_CALL - SHPCloseDiskTree( SHPTreeDiskHandle hDiskTree ); + void SHPAPI_CALL SHPCloseDiskTree(SHPTreeDiskHandle hDiskTree); -int SHPAPI_CALL1(*) -SHPSearchDiskTreeEx( SHPTreeDiskHandle hDiskTree, - double *padfBoundsMin, double *padfBoundsMax, - int *pnShapeCount ); + int SHPAPI_CALL1(*) + SHPSearchDiskTreeEx(const SHPTreeDiskHandle hDiskTree, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount); -int SHPAPI_CALL - SHPWriteTreeLL(SHPTree *hTree, const char *pszFilename, SAHooks *psHooks ); + int SHPAPI_CALL SHPWriteTreeLL(SHPTree *hTree, const char *pszFilename, + const SAHooks *psHooks); -/* -------------------------------------------------------------------- */ -/* SBN Search API */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* SBN Search API */ + /* -------------------------------------------------------------------- */ -typedef struct SBNSearchInfo* SBNSearchHandle; + typedef struct SBNSearchInfo *SBNSearchHandle; -SBNSearchHandle SHPAPI_CALL - SBNOpenDiskTree( const char* pszSBNFilename, - SAHooks *psHooks ); + SBNSearchHandle SHPAPI_CALL SBNOpenDiskTree(const char *pszSBNFilename, + const SAHooks *psHooks); -void SHPAPI_CALL - SBNCloseDiskTree( SBNSearchHandle hSBN ); + void SHPAPI_CALL SBNCloseDiskTree(SBNSearchHandle hSBN); -int SHPAPI_CALL1(*) -SBNSearchDiskTree( SBNSearchHandle hSBN, - double *padfBoundsMin, double *padfBoundsMax, - int *pnShapeCount ); + int SHPAPI_CALL1(*) + SBNSearchDiskTree(const SBNSearchHandle hSBN, + const double *padfBoundsMin, + const double *padfBoundsMax, int *pnShapeCount); -int SHPAPI_CALL1(*) -SBNSearchDiskTreeInteger( SBNSearchHandle hSBN, - int bMinX, int bMinY, int bMaxX, int bMaxY, - int *pnShapeCount ); + int SHPAPI_CALL1(*) + SBNSearchDiskTreeInteger(const SBNSearchHandle hSBN, int bMinX, + int bMinY, int bMaxX, int bMaxY, + int *pnShapeCount); -void SHPAPI_CALL SBNSearchFreeIds( int* panShapeId ); + void SHPAPI_CALL SBNSearchFreeIds(int *panShapeId); -/************************************************************************/ -/* DBF Support. */ -/************************************************************************/ -typedef struct -{ - SAHooks sHooks; + /************************************************************************/ + /* DBF Support. */ + /************************************************************************/ + typedef struct + { + SAHooks sHooks; - SAFile fp; + SAFile fp; - int nRecords; + int nRecords; - int nRecordLength; /* Must fit on uint16 */ - int nHeaderLength; /* File header length (32) + field - descriptor length + spare space. - Must fit on uint16 */ - int nFields; - int *panFieldOffset; - int *panFieldSize; - int *panFieldDecimals; - char *pachFieldType; + int nRecordLength; /* Must fit on uint16 */ + int nHeaderLength; /* File header length (32) + field + descriptor length + spare space. + Must fit on uint16 */ + int nFields; + int *panFieldOffset; + int *panFieldSize; + int *panFieldDecimals; + char *pachFieldType; - char *pszHeader; /* Field descriptors */ + char *pszHeader; /* Field descriptors */ - int nCurrentRecord; - int bCurrentRecordModified; - char *pszCurrentRecord; + int nCurrentRecord; + int bCurrentRecordModified; + char *pszCurrentRecord; - int nWorkFieldLength; - char *pszWorkField; + int nWorkFieldLength; + char *pszWorkField; - int bNoHeader; - int bUpdated; + int bNoHeader; + int bUpdated; - union - { - double dfDoubleField; - int nIntField; - } fieldValue; + union + { + double dfDoubleField; + int nIntField; + } fieldValue; + + int iLanguageDriver; + char *pszCodePage; - int iLanguageDriver; - char *pszCodePage; + int nUpdateYearSince1900; /* 0-255 */ + int nUpdateMonth; /* 1-12 */ + int nUpdateDay; /* 1-31 */ - int nUpdateYearSince1900; /* 0-255 */ - int nUpdateMonth; /* 1-12 */ - int nUpdateDay; /* 1-31 */ + int bWriteEndOfFileChar; /* defaults to TRUE */ - int bWriteEndOfFileChar; /* defaults to TRUE */ -} DBFInfo; + int bRequireNextWriteSeek; + } DBFInfo; -typedef DBFInfo * DBFHandle; + typedef DBFInfo *DBFHandle; -typedef enum { - FTString, - FTInteger, - FTDouble, - FTLogical, - FTDate, - FTInvalid -} DBFFieldType; + typedef enum + { + FTString, + FTInteger, + FTDouble, + FTLogical, + FTDate, + FTInvalid + } DBFFieldType; /* Field descriptor/header size */ -#define XBASE_FLDHDR_SZ 32 +#define XBASE_FLDHDR_SZ 32 /* Shapelib read up to 11 characters, even if only 10 should normally be used */ -#define XBASE_FLDNAME_LEN_READ 11 +#define XBASE_FLDNAME_LEN_READ 11 /* On writing, we limit to 10 characters */ #define XBASE_FLDNAME_LEN_WRITE 10 /* Normally only 254 characters should be used. We tolerate 255 historically */ -#define XBASE_FLD_MAX_WIDTH 255 - -DBFHandle SHPAPI_CALL - DBFOpen( const char * pszDBFFile, const char * pszAccess ); -DBFHandle SHPAPI_CALL - DBFOpenLL( const char * pszDBFFile, const char * pszAccess, - SAHooks *psHooks ); -DBFHandle SHPAPI_CALL - DBFCreate( const char * pszDBFFile ); -DBFHandle SHPAPI_CALL - DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); -DBFHandle SHPAPI_CALL - DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); - -int SHPAPI_CALL - DBFGetFieldCount( DBFHandle psDBF ); -int SHPAPI_CALL - DBFGetRecordCount( DBFHandle psDBF ); -int SHPAPI_CALL - DBFAddField( DBFHandle hDBF, const char * pszFieldName, - DBFFieldType eType, int nWidth, int nDecimals ); - -int SHPAPI_CALL - DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, - char chType, int nWidth, int nDecimals ); - -int SHPAPI_CALL - DBFDeleteField( DBFHandle hDBF, int iField ); - -int SHPAPI_CALL - DBFReorderFields( DBFHandle psDBF, int* panMap ); - -int SHPAPI_CALL - DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, - char chType, int nWidth, int nDecimals ); - -DBFFieldType SHPAPI_CALL - DBFGetFieldInfo( DBFHandle psDBF, int iField, - char * pszFieldName, int * pnWidth, int * pnDecimals ); - -int SHPAPI_CALL - DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); - -int SHPAPI_CALL - DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); -double SHPAPI_CALL - DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); -const char SHPAPI_CALL1(*) - DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); -const char SHPAPI_CALL1(*) - DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); -int SHPAPI_CALL - DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); - -int SHPAPI_CALL - DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, - int nFieldValue ); -int SHPAPI_CALL - DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, - double dFieldValue ); -int SHPAPI_CALL - DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, - const char * pszFieldValue ); -int SHPAPI_CALL - DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); - -int SHPAPI_CALL - DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, - const char lFieldValue); -int SHPAPI_CALL - DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, - void * pValue ); -const char SHPAPI_CALL1(*) - DBFReadTuple(DBFHandle psDBF, int hEntity ); -int SHPAPI_CALL - DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); - -int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); -int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, - int bIsDeleted ); - -DBFHandle SHPAPI_CALL - DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); - -void SHPAPI_CALL - DBFClose( DBFHandle hDBF ); -void SHPAPI_CALL - DBFUpdateHeader( DBFHandle hDBF ); -char SHPAPI_CALL - DBFGetNativeFieldType( DBFHandle hDBF, int iField ); - -const char SHPAPI_CALL1(*) - DBFGetCodePage(DBFHandle psDBF ); - -void SHPAPI_CALL - DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ); - -void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ); +#define XBASE_FLD_MAX_WIDTH 255 + + DBFHandle SHPAPI_CALL DBFOpen(const char *pszDBFFile, + const char *pszAccess); + DBFHandle SHPAPI_CALL DBFOpenLL(const char *pszDBFFile, + const char *pszAccess, + const SAHooks *psHooks); + DBFHandle SHPAPI_CALL DBFCreate(const char *pszDBFFile); + DBFHandle SHPAPI_CALL DBFCreateEx(const char *pszDBFFile, + const char *pszCodePage); + DBFHandle SHPAPI_CALL DBFCreateLL(const char *pszDBFFile, + const char *pszCodePage, + const SAHooks *psHooks); + + int SHPAPI_CALL DBFGetFieldCount(const DBFHandle psDBF); + int SHPAPI_CALL DBFGetRecordCount(const DBFHandle psDBF); + int SHPAPI_CALL DBFAddField(DBFHandle hDBF, const char *pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals); + + int SHPAPI_CALL DBFAddNativeFieldType(DBFHandle hDBF, + const char *pszFieldName, char chType, + int nWidth, int nDecimals); + + int SHPAPI_CALL DBFDeleteField(DBFHandle hDBF, int iField); + + int SHPAPI_CALL DBFReorderFields(DBFHandle psDBF, const int *panMap); + + int SHPAPI_CALL DBFAlterFieldDefn(DBFHandle psDBF, int iField, + const char *pszFieldName, char chType, + int nWidth, int nDecimals); + + DBFFieldType SHPAPI_CALL DBFGetFieldInfo(const DBFHandle psDBF, int iField, + char *pszFieldName, int *pnWidth, + int *pnDecimals); + + int SHPAPI_CALL DBFGetFieldIndex(const DBFHandle psDBF, + const char *pszFieldName); + + int SHPAPI_CALL DBFReadIntegerAttribute(DBFHandle hDBF, int iShape, + int iField); + double SHPAPI_CALL DBFReadDoubleAttribute(DBFHandle hDBF, int iShape, + int iField); + const char SHPAPI_CALL1(*) + DBFReadStringAttribute(DBFHandle hDBF, int iShape, int iField); + const char SHPAPI_CALL1(*) + DBFReadLogicalAttribute(DBFHandle hDBF, int iShape, int iField); + SHPDate SHPAPI_CALL DBFReadDateAttribute(DBFHandle hDBF, int iShape, + int iField); + int SHPAPI_CALL DBFIsAttributeNULL(const DBFHandle hDBF, int iShape, + int iField); + + int SHPAPI_CALL DBFWriteIntegerAttribute(DBFHandle hDBF, int iShape, + int iField, int nFieldValue); + int SHPAPI_CALL DBFWriteDoubleAttribute(DBFHandle hDBF, int iShape, + int iField, double dFieldValue); + int SHPAPI_CALL DBFWriteStringAttribute(DBFHandle hDBF, int iShape, + int iField, + const char *pszFieldValue); + int SHPAPI_CALL DBFWriteNULLAttribute(DBFHandle hDBF, int iShape, + int iField); + + int SHPAPI_CALL DBFWriteLogicalAttribute(DBFHandle hDBF, int iShape, + int iField, + const char lFieldValue); + int SHPAPI_CALL DBFWriteDateAttribute(DBFHandle hDBF, int iShape, + int iField, + const SHPDate *dateFieldValue); + int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, + int iField, const void *pValue); + const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity); + int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, + const void *pRawTuple); + + int SHPAPI_CALL DBFIsRecordDeleted(const DBFHandle psDBF, int iShape); + int SHPAPI_CALL DBFMarkRecordDeleted(DBFHandle psDBF, int iShape, + int bIsDeleted); + + DBFHandle SHPAPI_CALL DBFCloneEmpty(const DBFHandle psDBF, + const char *pszFilename); + + void SHPAPI_CALL DBFClose(DBFHandle hDBF); + void SHPAPI_CALL DBFUpdateHeader(DBFHandle hDBF); + char SHPAPI_CALL DBFGetNativeFieldType(const DBFHandle hDBF, int iField); + + const char SHPAPI_CALL1(*) DBFGetCodePage(const DBFHandle psDBF); + + void SHPAPI_CALL DBFSetLastModifiedDate(DBFHandle psDBF, int nYYSince1900, + int nMM, int nDD); + + void SHPAPI_CALL DBFSetWriteEndOfFileChar(DBFHandle psDBF, int bWriteFlag); #ifdef __cplusplus } diff --git a/shapelib/shapefil_private.h b/shapelib/shapefil_private.h new file mode 100644 index 000000000..fd9ea93eb --- /dev/null +++ b/shapelib/shapefil_private.h @@ -0,0 +1,117 @@ +#ifndef SHAPEFILE_PRIVATE_H_INCLUDED +#define SHAPEFILE_PRIVATE_H_INCLUDED + +/****************************************************************************** + * + * Project: Shapelib + * Purpose: Private include file for Shapelib. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012-2024, Even Rouault + * + * SPDX-License-Identifier: MIT OR LGPL-2.0-or-later + ****************************************************************************** + * + */ + +#ifdef __cplusplus +#define STATIC_CAST(type, x) static_cast(x) +#define REINTERPRET_CAST(type, x) reinterpret_cast(x) +#define CONST_CAST(type, x) const_cast(x) +#define SHPLIB_NULLPTR nullptr +#else +#define STATIC_CAST(type, x) ((type)(x)) +#define REINTERPRET_CAST(type, x) ((type)(x)) +#define CONST_CAST(type, x) ((type)(x)) +#define SHPLIB_NULLPTR NULL +#endif + +#if !defined(SHP_BIG_ENDIAN) +#if defined(CPL_MSB) +#define SHP_BIG_ENDIAN 1 +#elif (defined(__GNUC__) && __GNUC__ >= 5) || \ + (defined(__GNUC__) && defined(__GNUC_MINOR__) && __GNUC__ == 4 && \ + __GNUC_MINOR__ >= 6) +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define SHP_BIG_ENDIAN 1 +#endif +#elif defined(__GLIBC__) +#if __BYTE_ORDER == __BIG_ENDIAN +#define SHP_BIG_ENDIAN 1 +#endif +#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +#define SHP_BIG_ENDIAN 1 +#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +#elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || \ + defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || \ + defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +#define SHP_BIG_ENDIAN 1 +#endif +#endif + +#include "shapefil.h" +#include +#include + +/************************************************************************/ +/* Little endian <==> big endian byte swap macros. */ +/************************************************************************/ + +#if (defined(__GNUC__) && __GNUC__ >= 5) || \ + (defined(__GNUC__) && defined(__GNUC_MINOR__) && __GNUC__ == 4 && \ + __GNUC_MINOR__ >= 8) +#define _SHP_SWAP32(x) \ + STATIC_CAST(uint32_t, __builtin_bswap32(STATIC_CAST(uint32_t, x))) +#define _SHP_SWAP64(x) \ + STATIC_CAST(uint64_t, __builtin_bswap64(STATIC_CAST(uint64_t, x))) +#elif defined(_MSC_VER) +#define _SHP_SWAP32(x) \ + STATIC_CAST(uint32_t, _byteswap_ulong(STATIC_CAST(uint32_t, x))) +#define _SHP_SWAP64(x) \ + STATIC_CAST(uint64_t, _byteswap_uint64(STATIC_CAST(uint64_t, x))) +#else +#define _SHP_SWAP32(x) \ + STATIC_CAST(uint32_t, \ + ((STATIC_CAST(uint32_t, x) & 0x000000ffU) << 24) | \ + ((STATIC_CAST(uint32_t, x) & 0x0000ff00U) << 8) | \ + ((STATIC_CAST(uint32_t, x) & 0x00ff0000U) >> 8) | \ + ((STATIC_CAST(uint32_t, x) & 0xff000000U) >> 24)) +#define _SHP_SWAP64(x) \ + ((STATIC_CAST(uint64_t, _SHP_SWAP32(STATIC_CAST(uint32_t, x))) << 32) | \ + (STATIC_CAST(uint64_t, _SHP_SWAP32(STATIC_CAST( \ + uint32_t, STATIC_CAST(uint64_t, x) >> 32))))) + +#endif + +/* in-place uint32_t* swap */ +#define SHP_SWAP32(p) \ + *REINTERPRET_CAST(uint32_t *, p) = \ + _SHP_SWAP32(*REINTERPRET_CAST(uint32_t *, p)) +/* in-place uint64_t* swap */ +#define SHP_SWAP64(p) \ + *REINTERPRET_CAST(uint64_t *, p) = \ + _SHP_SWAP64(*REINTERPRET_CAST(uint64_t *, p)) +/* in-place double* swap */ +#define SHP_SWAPDOUBLE(x) \ + do \ + { \ + uint64_t _n64; \ + void *_lx = x; \ + memcpy(&_n64, _lx, 8); \ + _n64 = _SHP_SWAP64(_n64); \ + memcpy(_lx, &_n64, 8); \ + } while (0) +/* copy double* swap*/ +#define SHP_SWAPDOUBLE_CPY(dst, src) \ + do \ + { \ + uint64_t _n64; \ + const void *_ls = src; \ + void *_ld = dst; \ + memcpy(&_n64, _ls, 8); \ + _n64 = _SHP_SWAP64(_n64); \ + memcpy(_ld, &_n64, 8); \ + } while (0) +#endif /* ndef SHAPEFILE_PRIVATE_H_INCLUDED */ diff --git a/shapelib/shapelib.html b/shapelib/shapelib.html index fa81f91aa..b3d72ba5a 100644 --- a/shapelib/shapelib.html +++ b/shapelib/shapelib.html @@ -27,20 +27,19 @@

Supporting Information

What is a Shapefile?

If you don't know, you probably don't need this library. The Shapefile -format is a working and interchange format promulagated by +format is a working and interchange format promulgated by ESRI for simple vector data with attributes.

-An excellent white paper on the shapefile format -is available from ESRI, -but it is .pdf format, so you will need Adobe Acrobat to browse it.

+An excellent white paper +on the shapefile format is available from ESRI.

The file format actually consists of three files.

 XXX.shp - holds the actual vertices.
 XXX.shx - hold index data pointing to the structures in the .shp file.
-XXX.dbf - holds the attributes in xBase (dBase) format.  
+XXX.dbf - holds the attributes in xBase (dBase) format.
 

Download

@@ -48,27 +47,22 @@

Download

Source code, and some other odds and ends can be downloaded from http://download.osgeo.org/shapelib.

-Shapelib is available for anonymous CVS access: - -

-  cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot login
-  Password: (hit enter)
-  cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot co shapelib
-
+Shapelib repository is at +https://github.com/OSGeo/shapelib

Bugs, Maintainance and Support

-This library is maintained by Frank -Warmerdam. Please send me bug reports, patches and suggestions for the +This library is maintained by Frank +Warmerdam. Please send me bug reports, patches and suggestions for the library via the maptools.org Bugzilla. Shapelib bugs can also be queried.

-Shapelib is hosted at +Shapelib is hosted at shapelib.maptools.org. A mailing -list for discussion of how to use shapelib, and announcing new releases -is -available. To get notification of new releases of Shapelib subscribe to +list for discussion of how to use shapelib, and announcing new releases +is +available. To get notification of new releases of Shapelib subscribe to the project mailing list at https://lists.osgeo.org/pipermail/shapelib/.

Credits

@@ -78,7 +72,7 @@

Credits

  • Bill Miller (NY-DOT) for shputils.c -
  • Carl Anderson for the contents of the contrib directory, and +
  • Carl Anderson for the contents of the contrib directory, and the "tuple" additions to dbfopen.c.
  • Andrea Giacomelli for patches for dbfopen.c.
  • Doug Matthews for portability improvements. @@ -96,10 +90,10 @@

    Credits

    In Memorium

    I would like to dedicate Shapelib to the memory of Sol Katz. While I never -met him in person, his generous contributions to the GIS community took +met him in person, his generous contributions to the GIS community took many forms, including free distribution of a variety of GIS translators -with source. The fact that he used this Shapelib in some of his utilities, -and thanked me was a great encouragement to me. I hope I can do his memory +with source. The fact that he used this Shapelib in some of his utilities, +and thanked me was a great encouragement to me. I hope I can do his memory honour by trying to contribute in a similar fashion.

    Portability

    @@ -114,7 +108,7 @@

    Portability

    The shputils.c module is contributed, and may not take the same approach to portability as the rest of the package.

    -On Linux, and most unix systems it should be possible to build and +On Linux, and most unix systems it should be possible to build and install shapefile support as a shared library using the "lib" and "lib_install" targets of the Makefile. Note that this Makefile doesn't use autoconf mechanisms and will generally require some hand tailoring for your environment. @@ -123,11 +117,11 @@

    Limitations

      -
    • You can't modify the vertices of existing structures (though you - can update the attributes of existing structures, and create new +
    • You can't modify the vertices of existing structures (though you + can update the attributes of existing structures, and create new structures).

      -

    • Not written in such a way as to be particularly fast. This is +
    • Not written in such a way as to be particularly fast. This is particularly true of the 1.2 API. For applications more concerned with speed it may be worth using the V1.1 API.

      @@ -159,32 +153,32 @@

      Other Shapefile Resources

    • Language ID / Code Page mappings

      -

    • Shapelib is used within the multiformat -OGR library. If you are looking for a +
    • Shapelib is used within the multiformat +OGR library. If you are looking for a high level C++ library with support for many geospatial vector formats you might want to check it out.

      -

    • Ari Jolma has produced an initial perl binding on top of shapelib, -which can be found at CPAN as Geo::ShapeFile under the +
    • Ari Jolma has produced an initial perl binding on top of shapelib, +which can be found at CPAN as Geo::ShapeFile under the Geo module.

      -

    • Bernhard Herzog has produced python bindings for Shapelib with -SWIG, available at http://ftp.intevation.de/users/bh/pyshapelib. A new version not using swig is +
    • Bernhard Herzog has produced python bindings for Shapelib with +SWIG, available at http://ftp.intevation.de/users/bh/pyshapelib. A new version not using swig is available as part of Thuban.

    • Delphi bindings for Shapelib courtesy of Alexander Weidauer.

      -

    • Miguel Filgueiras has implemented +
    • Miguel Filgueiras has implemented Tcl bindings for Shapelib as part of GPSMan.

    • David Gancarz has implemented a Microsoft .NET wrapper for -Shapelib. An example of using shapelib with VB6 is also icluded in the .NET wrapper project file.

      +Shapelib. An example of using shapelib with VB6 is also included in the .NET wrapper project file.

      -

    • Andrey Hristov (php at hristov dot com) has developed a PHP extension +
    • Andrey Hristov (php at hristov dot com) has developed a PHP extension based on Shapelib. It can be found in CVS at http://cvs.php.net/pecl/shp.

    • Toyoda Eizi has developed Ruby bindings found at @@ -200,11 +194,11 @@

      Other Shapefile Resources

    • Tom Russo has implemented a shpcs2cs program, which reprojects shapefiles using arguments similar to the PROJ.4 cs2cs program including datum conversion. -Use as an alternate to the contrib/shpproj which doesn't do datums. It is +Use as an alternate to the contrib/shpproj which doesn't do datums. It is available at the bottom of Tom's Xastir Shapefile Resources page.

      -

    • -Andrew Williamson's +
    • +Andrew Williamson's Useful Scripts and Stuff page for ArcView, which includes ShapeChecker.

      @@ -216,13 +210,13 @@

      Other Shapefile Resources

    • The ShapeFile Read/Write OCX is another option for Visual Basic programmers.

      -

    • Isovist Analyst is a sort-of-free isovist generating extension for +
    • Isovist Analyst is a sort-of-free isovist generating extension for ArcView using shapelib.

      -

    • shpdiff utility +
    • shpdiff utility by Bryce Nesbitt.

      -

    • Aequometer: a program for +
    • Aequometer: a program for MS Excel to calculate the area of polygons and export as shapefiles.

    diff --git a/shapelib/shp_api.html b/shapelib/shp_api.html index d773e3e56..f80a25a0e 100644 --- a/shapelib/shp_api.html +++ b/shapelib/shp_api.html @@ -31,7 +31,7 @@

    Shape Types

    3D Shape Types (may include "measure" values for vertices): - #define SHPT_POINTZ 11 + #define SHPT_POINTZ 11 #define SHPT_ARCZ 13 #define SHPT_POLYGONZ 15 #define SHPT_MULTIPOINTZ 18 @@ -66,9 +66,9 @@

    SHPObject

    int nParts; # of Parts (0 implies single part with no info) int *panPartStart; Start Vertex of part int *panPartType; Part Type (SHPP_RING if not SHPT_MULTIPATCH) - - int nVertices; Vertex list - double *padfX; + + int nVertices; Vertex list + double *padfX; double *padfY; double *padfZ; (all zero if not provided) double *padfM; (all zero if not provided) @@ -82,6 +82,9 @@

    SHPObject

    double dfYMax; double dfZMax; double dfMMax; + + int bMeasureIsUsed; + int bFastModeReadObject; } SHPObject;
@@ -97,15 +100,15 @@

SHPOpen()

just be the path plus the basename of the pair. pszAccess: The fopen() style access string. At this time only - "rb" (read-only binary) and "rb+" (read/write binary) + "rb" (read-only binary) and "rb+" (read/write binary) should be used.
The SHPOpen() function should be used to establish access to the two files - for accessing vertices (.shp and .shx). Note that both files have to + for accessing vertices (.shp and .shx). Note that both files have to be in the indicated directory, and must have the expected extensions in - lower case. The returned SHPHandle is passed to other access functions, - and SHPClose() should be invoked to recover resources, and flush changes + lower case. The returned SHPHandle is passed to other access functions, + and SHPClose() should be invoked to recover resources, and flush changes to disk when complete.

@@ -113,10 +116,10 @@

SHPOpen()

SHPGetInfo()

-void SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
+void SHPGetInfo( const SHPHandle hSHP, int * pnEntities, int * pnShapeType,
                  double * padfMinBound, double * padfMaxBound );
 
-  hSHP:			The handle previously returned by SHPOpen() 
+  hSHP:			The handle previously returned by SHPOpen()
 			or SHPCreate().
 
   pnEntities:		A pointer to an integer into which the number of
@@ -124,31 +127,31 @@ 

SHPGetInfo()

pnShapetype: A pointer to an integer into which the shapetype of this file should be placed. Shapefiles may contain - either SHPT_POINT, SHPT_ARC, SHPT_POLYGON or + either SHPT_POINT, SHPT_ARC, SHPT_POLYGON or SHPT_MULTIPOINT entities. This may be NULL. padfMinBound: The X, Y, Z and M minimum values will be placed into this four entry array. This may be NULL. - + padfMaxBound: The X, Y, Z and M maximum values will be placed into this four entry array. This may be NULL.
The SHPGetInfo() function retrieves various information about shapefile - as a whole. The bounds are read from the file header, and may be + as a whole. The bounds are read from the file header, and may be inaccurate if the file was improperly generated.

- +

SHPReadObject()

-SHPObject *SHPReadObject( SHPHandle hSHP, int iShape );
+SHPObject *SHPReadObject( const SHPHandle hSHP, int iShape );
 
-  hSHP:			The handle previously returned by SHPOpen() 
+  hSHP:			The handle previously returned by SHPOpen()
 			or SHPCreate().
 
-  iShape:		The entity number of the shape to read.  Entity 
+  iShape:		The entity number of the shape to read.  Entity
 			numbers are between 0 and nEntities-1 (as returned
 			by SHPGetInfo()).
 
@@ -156,7 +159,7 @@

SHPReadObject()

The SHPReadObject() call is used to read a single structure, or entity from the shapefile. See the definition of the SHPObject structure for detailed information on fields of a SHPObject. SHPObject's returned from - SHPReadObject() should be deallocated with SHPDestroyShape(). + SHPReadObject() should be deallocated with SHPDestroyShape(). SHPReadObject() will return NULL if an illegal iShape value is requested.

Note that the bounds placed into the SHPObject are those read from the @@ -175,7 +178,7 @@

SHPClose()

 void	SHPClose( SHPHandle hSHP );
 
-  hSHP:			The handle previously returned by SHPOpen() 
+  hSHP:			The handle previously returned by SHPOpen()
 			or SHPCreate().
 
@@ -196,7 +199,7 @@

SHPCreate()

just be the path plus the basename of the pair. nShapeType: The type of shapes to be stored in the newly created - file. It may be either SHPT_POINT, SHPT_ARC, + file. It may be either SHPT_POINT, SHPT_ARC, SHPT_POLYGON or SHPT_MULTIPOINT.
@@ -208,15 +211,16 @@

SHPCreate()

SHPCreateSimpleObject()

-SHPObject * 
-     SHPCreateSimpleObject( int nSHPType, int nVertices, 
-			    double *padfX, double * padfY, double *padfZ, );
+SHPObject *
+     SHPCreateSimpleObject( int nSHPType, int nVertices,
+			    const double *padfX, const double * padfY,
+			    const double *padfZ );
 
   nSHPType:		The SHPT_ type of the object to be created, such
                         as SHPT_POINT, or SHPT_POLYGON.
-  
-  nVertices:		The number of vertices being passed in padfX,    
-                        padfY, and padfZ. 
+
+  nVertices:		The number of vertices being passed in padfX,
+                        padfY, and padfZ.
 
   padfX:		An array of nVertices X coordinates of the vertices
                         for this object.
@@ -229,7 +233,7 @@ 

SHPCreateSimpleObject()

they are all assumed to be zero.
- The SHPCreateSimpleObject() allows for the convenient creation of + The SHPCreateSimpleObject() allows for the convenient creation of simple objects. This is normally used so that the SHPObject can be passed to SHPWriteObject() to write it to the file. The simple object creation API assumes an M (measure) value of zero for each vertex. For @@ -240,7 +244,7 @@

SHPCreateSimpleObject()

SHPDestroyObject() function should be used to free resources associated with an object allocated with SHPCreateSimpleObject().

- This function computes a bounding box for the SHPObject from the given + This function computes a bounding box for the SHPObject from the given vertices.

@@ -248,11 +252,12 @@

SHPCreateSimpleObject()

SHPCreateObject()

-SHPObject * 
+SHPObject *
      SHPCreateObject( int nSHPType, int iShape,
-                      int nParts, int * panPartStart, int * panPartType,
-                      int nVertices, double *padfX, double * padfY, 
-                      double *padfZ, double *padfM );
+                      int nParts, const int * panPartStart,
+                      const int * panPartType,
+                      int nVertices, const double *padfX, const double * padfY,
+                      const double *padfZ, const double *padfM );
 
   nSHPType:		The SHPT_ type of the object to be created, such
                         as SHPT_POINT, or SHPT_POLYGON.
@@ -260,19 +265,19 @@ 

SHPCreateObject()

iShape: The shapeid to be recorded with this shape. nParts: The number of parts for this object. If this is - zero for ARC, or POLYGON type objects, a single + zero for ARC, or POLYGON type objects, a single zero valued part will be created internally. - + panPartStart: The list of zero based start vertices for the rings (parts) in this object. The first should always be zero. This may be NULL if nParts is 0. - + panPartType: The type of each of the parts. This is only meaningful for MULTIPATCH files. For all other cases this may be NULL, and will be assumed to be SHPP_RING. - - nVertices: The number of vertices being passed in padfX, - padfY, and padfZ. + + nVertices: The number of vertices being passed in padfX, + padfY, and padfZ. padfX: An array of nVertices X coordinates of the vertices for this object. @@ -284,19 +289,19 @@

SHPCreateObject()

for this object. This may be NULL in which case they are all assumed to be zero. - padfM: An array of nVertices M (measure values) of the - vertices for this object. This may be NULL in which + padfM: An array of nVertices M (measure values) of the + vertices for this object. This may be NULL in which case they are all assumed to be zero.
- The SHPCreateSimpleObject() allows for the creation of objects (shapes). - This is normally used so that the SHPObject can be passed to + The SHPCreateSimpleObject() allows for the creation of objects (shapes). + This is normally used so that the SHPObject can be passed to SHPWriteObject() to write it to the file.

- The SHPDestroyObject() function should be used to free resources associated + The SHPDestroyObject() function should be used to free resources associated with an object allocated with SHPCreateObject().

- This function computes a bounding box for the SHPObject from the given + This function computes a bounding box for the SHPObject from the given vertices.

@@ -308,9 +313,9 @@

SHPComputeExtents()

psObject: An existing shape object to be updated in place.
- + This function will recompute the extents of this shape, replacing the - existing values of the dfXMin, dfYMin, dfZMin, dfMMin, dfXMax, dfYMax, + existing values of the dfXMin, dfYMin, dfZMin, dfMMin, dfXMax, dfYMax, dfZMax, and dfMMax values based on the current set of vertices for the shape. This function is automatically called by SHPCreateObject() but if the vertices of an existing object are altered it should be called again @@ -321,16 +326,16 @@

SHPComputeExtents()

SHPWriteObject()

-int SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject *psObject );
+int SHPWriteObject( SHPHandle hSHP, int iShape, const SHPObject *psObject );
 
-  hSHP:			The handle previously returned by SHPOpen("r+") 
+  hSHP:			The handle previously returned by SHPOpen("r+")
 			or SHPCreate().
 
   iShape:		The entity number of the shape to write.  A value of
-		        -1 should be used for new shapes.  
+		        -1 should be used for new shapes.
 
   psObject:		The shape to write to the file. This should have
-                        been created with SHPCreateObject(), or 
+                        been created with SHPCreateObject(), or
                         SHPCreateSimpleObject().
 
@@ -368,7 +373,7 @@

SHPRewindObject()

This function will reverse any rings necessary in order to enforce the shapefile restrictions on the required order of inner and outer rings in the Shapefile specification. It returns TRUE if a change is made and FALSE - if no change is made. Only polygon objects will be affected though any + if no change is made. Only polygon objects will be affected though any object may be passed.

diff --git a/shapelib/shpopen.c b/shapelib/shpopen.c index 2fcff96da..014e15770 100644 --- a/shapelib/shpopen.c +++ b/shapelib/shpopen.c @@ -1,5 +1,4 @@ /****************************************************************************** - * $Id: shpopen.c,v 1.78 2019-02-28 15:55:23 erouault Exp $ * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. @@ -7,580 +6,242 @@ * ****************************************************************************** * Copyright (c) 1999, 2001, Frank Warmerdam - * Copyright (c) 2011-2013, Even Rouault + * Copyright (c) 2011-2024, Even Rouault * - * This software is available under the following "MIT Style" license, - * or at the option of the licensee under the LGPL (see COPYING). This - * option is discussed in more detail in shapelib.html. - * - * -- - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - ****************************************************************************** - * - * $Log: shpopen.c,v $ - * Revision 1.78 2019-02-28 15:55:23 erouault - * * shpopen.c: resync with GDAL internal shapelib to avoid being dependent - * on correctness of file size field in .shp. Fixes - * https://lists.osgeo.org/pipermail/gdal-dev/2018-October/049218.html - * - * Revision 1.77 2018-08-16 15:39:07 erouault - * * shpopen.c, dbfopen.c, shptree.c, sbnsearch.c: resyc with GDAL - * internal shapelib. Mostly to allow building those files as C++ - * without warning. Also add FTDate entry in DBFFieldType - * (see https://github.com/OSGeo/gdal/pull/308). And some other - * code cleanups - * - * Revision 1.76 2017-09-10 10:11:36 erouault - * * shpopen.c: resync with GDAL copy. Make sure to zero terminate all - * error messages. And fix regression regarding re-writing the last shape - * of a file (https://trac.osgeo.org/gdal/ticket/7031) - * - * Revision 1.75 2016-12-05 12:44:05 erouault - * * Major overhaul of Makefile build system to use autoconf/automake. - * - * * Warning fixes in contrib/ - * - * Revision 1.74 2016-12-04 15:30:15 erouault - * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with - * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo - * structures extended with new members. New functions: - * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, - * SHPSetFastModeReadObject - * - * * sbnsearch.c: new file to implement original ESRI .sbn spatial - * index reading. (no write support). New functions: - * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, - * SBNSearchDiskTreeInteger, SBNSearchFreeIds - * - * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates - * with new file and symbols. - * - * * commit: helper script to cvs commit - * - * Revision 1.73 2012-01-24 22:33:01 fwarmerdam - * fix memory leak on failure to open .shp (gdal #4410) - * - * Revision 1.72 2011-12-11 22:45:28 fwarmerdam - * fix failure return from SHPOpenLL. - * - * Revision 1.71 2011-09-15 03:33:58 fwarmerdam - * fix missing cast (#2344) - * - * Revision 1.70 2011-07-24 05:59:25 fwarmerdam - * minimize use of CPLError in favor of SAHooks.Error() - * - * Revision 1.69 2011-07-24 03:24:22 fwarmerdam - * fix memory leaks in error cases creating shapefiles (#2061) - * - * Revision 1.68 2010-08-27 23:42:52 fwarmerdam - * add SHPAPI_CALL attribute in code - * - * Revision 1.67 2010-07-01 08:15:48 fwarmerdam - * do not error out on an object with zero vertices - * - * Revision 1.66 2010-07-01 07:58:57 fwarmerdam - * minor cleanup of error handling - * - * Revision 1.65 2010-07-01 07:27:13 fwarmerdam - * white space formatting adjustments - * - * Revision 1.64 2010-01-28 11:34:34 fwarmerdam - * handle the shape file length limits more gracefully (#3236) - * - * Revision 1.63 2010-01-28 04:04:40 fwarmerdam - * improve numerical accuracy of SHPRewind() algs (gdal #3363) - * - * Revision 1.62 2010-01-17 05:34:13 fwarmerdam - * Remove asserts on x/y being null (#2148). - * - * Revision 1.61 2010-01-16 05:07:42 fwarmerdam - * allow 0/nulls in shpcreateobject (#2148) - * - * Revision 1.60 2009-09-17 20:50:02 bram - * on Win32, define snprintf as alias to _snprintf - * - * Revision 1.59 2008-03-14 05:25:31 fwarmerdam - * Correct crash on buggy geometries (gdal #2218) - * - * Revision 1.58 2008/01/08 23:28:26 bram - * on line 2095, use a float instead of a double to avoid a compiler warning - * - * Revision 1.57 2007/12/06 07:00:25 fwarmerdam - * dbfopen now using SAHooks for fileio - * - * Revision 1.56 2007/12/04 20:37:56 fwarmerdam - * preliminary implementation of hooks api for io and errors - * - * Revision 1.55 2007/11/21 22:39:56 fwarmerdam - * close shx file in readonly mode (GDAL #1956) - * - * Revision 1.54 2007/11/15 00:12:47 mloskot - * Backported recent changes from GDAL (Ticket #1415) to Shapelib. - * - * Revision 1.53 2007/11/14 22:31:08 fwarmerdam - * checks after mallocs to detect for corrupted/voluntary broken shapefiles. - * http://trac.osgeo.org/gdal/ticket/1991 - * - * Revision 1.52 2007/06/21 15:58:33 fwarmerdam - * fix for SHPRewindObject when rings touch at one vertex (gdal #976) - * - * Revision 1.51 2006/09/04 15:24:01 fwarmerdam - * Fixed up log message for 1.49. - * - * Revision 1.50 2006/09/04 15:21:39 fwarmerdam - * fix of last fix - * - * Revision 1.49 2006/09/04 15:21:00 fwarmerdam - * MLoskot: Added stronger test of Shapefile reading failures, e.g. truncated - * files. The problem was discovered by Tim Sutton and reported here - * https://svn.qgis.org/trac/ticket/200 - * - * Revision 1.48 2006/01/26 15:07:32 fwarmerdam - * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 - * - * Revision 1.47 2006/01/04 20:07:23 fwarmerdam - * In SHPWriteObject() make sure that the record length is updated - * when rewriting an existing record. - * - * Revision 1.46 2005/02/11 17:17:46 fwarmerdam - * added panPartStart[0] validation - * - * Revision 1.45 2004/09/26 20:09:48 fwarmerdam - * const correctness changes - * - * Revision 1.44 2003/12/29 00:18:39 fwarmerdam - * added error checking for failed IO and optional CPL error reporting - * - * Revision 1.43 2003/12/01 16:20:08 warmerda - * be careful of zero vertex shapes - * - * Revision 1.42 2003/12/01 14:58:27 warmerda - * added degenerate object check in SHPRewindObject() - * - * Revision 1.41 2003/07/08 15:22:43 warmerda - * avoid warning - * - * Revision 1.40 2003/04/21 18:30:37 warmerda - * added header write/update public methods - * - * Revision 1.39 2002/08/26 06:46:56 warmerda - * avoid c++ comments - * - * Revision 1.38 2002/05/07 16:43:39 warmerda - * Removed debugging printf() - * - * Revision 1.37 2002/04/10 17:35:22 warmerda - * fixed bug in ring reversal code - * - * Revision 1.36 2002/04/10 16:59:54 warmerda - * added SHPRewindObject - * - * Revision 1.35 2001/12/07 15:10:44 warmerda - * fix if .shx fails to open - * - * Revision 1.34 2001/11/01 16:29:55 warmerda - * move pabyRec into SHPInfo for thread safety - * - * Revision 1.33 2001/07/03 12:18:15 warmerda - * Improved cleanup if SHX not found, provided by Riccardo Cohen. - * - * Revision 1.32 2001/06/22 01:58:07 warmerda - * be more careful about establishing initial bounds in face of NULL shapes - * - * Revision 1.31 2001/05/31 19:35:29 warmerda - * added support for writing null shapes - * - * Revision 1.30 2001/05/28 12:46:29 warmerda - * Add some checking on reasonableness of record count when opening. - * - * Revision 1.29 2001/05/23 13:36:52 warmerda - * added use of SHPAPI_CALL - * - * Revision 1.28 2001/02/06 22:25:06 warmerda - * fixed memory leaks when SHPOpen() fails - * - * Revision 1.27 2000/07/18 15:21:33 warmerda - * added better enforcement of -1 for append in SHPWriteObject - * - * Revision 1.26 2000/02/16 16:03:51 warmerda - * added null shape support - * - * Revision 1.25 1999/12/15 13:47:07 warmerda - * Fixed record size settings in .shp file (was 4 words too long) - * Added stdlib.h. - * - * Revision 1.24 1999/11/05 14:12:04 warmerda - * updated license terms - * - * Revision 1.23 1999/07/27 00:53:46 warmerda - * added support for rewriting shapes - * - * Revision 1.22 1999/06/11 19:19:11 warmerda - * Cleanup pabyRec static buffer on SHPClose(). - * - * Revision 1.21 1999/06/02 14:57:56 kshih - * Remove unused variables - * - * Revision 1.20 1999/04/19 21:04:17 warmerda - * Fixed syntax error. - * - * Revision 1.19 1999/04/19 21:01:57 warmerda - * Force access string to binary in SHPOpen(). - * - * Revision 1.18 1999/04/01 18:48:07 warmerda - * Try upper case extensions if lower case doesn't work. - * - * Revision 1.17 1998/12/31 15:29:39 warmerda - * Disable writing measure values to multipatch objects if - * DISABLE_MULTIPATCH_MEASURE is defined. - * - * Revision 1.16 1998/12/16 05:14:33 warmerda - * Added support to write MULTIPATCH. Fixed reading Z coordinate of - * MULTIPATCH. Fixed record size written for all feature types. - * - * Revision 1.15 1998/12/03 16:35:29 warmerda - * r+b is proper binary access string, not rb+. - * - * Revision 1.14 1998/12/03 15:47:56 warmerda - * Fixed setting of nVertices in SHPCreateObject(). - * - * Revision 1.13 1998/12/03 15:33:54 warmerda - * Made SHPCalculateExtents() separately callable. - * - * Revision 1.12 1998/11/11 20:01:50 warmerda - * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. - * - * Revision 1.11 1998/11/09 20:56:44 warmerda - * Fixed up handling of file wide bounds. - * - * Revision 1.10 1998/11/09 20:18:51 warmerda - * Converted to support 3D shapefiles, and use of SHPObject. - * - * Revision 1.9 1998/02/24 15:09:05 warmerda - * Fixed memory leak. - * - * Revision 1.8 1997/12/04 15:40:29 warmerda - * Fixed byte swapping of record number, and record length fields in the - * .shp file. - * - * Revision 1.7 1995/10/21 03:15:58 warmerda - * Added support for binary file access, the magic cookie 9997 - * and tried to improve the int32 selection logic for 16bit systems. - * - * Revision 1.6 1995/09/04 04:19:41 warmerda - * Added fix for file bounds. - * - * Revision 1.5 1995/08/25 15:16:44 warmerda - * Fixed a couple of problems with big endian systems ... one with bounds - * and the other with multipart polygons. - * - * Revision 1.4 1995/08/24 18:10:17 warmerda - * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() - * functions (such as on the Sun). - * - * Revision 1.3 1995/08/23 02:23:15 warmerda - * Added support for reading bounds, and fixed up problems in setting the - * file wide bounds. - * - * Revision 1.2 1995/08/04 03:16:57 warmerda - * Added header. - * - */ + * SPDX-License-Identifier: MIT OR LGPL-2.0-or-later + ******************************************************************************/ -#include "shapefil.h" +#include "shapefil_private.h" -#include -#include #include +#include +#include +#include +#include +#include +#include #include #include -#include -#include - -SHP_CVSID("$Id: shpopen.c,v 1.78 2019-02-28 15:55:23 erouault Exp $") - -typedef unsigned char uchar; - -#if UINT_MAX == 65535 -typedef unsigned long int32; -#else -typedef unsigned int int32; -#endif #ifndef FALSE -# define FALSE 0 -# define TRUE 1 +#define FALSE 0 +#define TRUE 1 #endif -#define ByteCopy( a, b, c ) memcpy( b, a, c ) +#define ByteCopy(a, b, c) memcpy(b, a, c) #ifndef MAX -# define MIN(a,b) ((ab) ? a : b) +#define MIN(a, b) ((a < b) ? a : b) +#define MAX(a, b) ((a > b) ? a : b) #endif #ifndef USE_CPL #if defined(_MSC_VER) -# if _MSC_VER < 1900 -# define snprintf _snprintf -# endif -#elif defined(WIN32) || defined(_WIN32) -# ifndef snprintf -# define snprintf _snprintf -# endif +#if _MSC_VER < 1900 +#define snprintf _snprintf #endif +#elif defined(_WIN32) +#ifndef snprintf +#define snprintf _snprintf #endif - -#ifndef CPL_UNUSED -#if defined(__GNUC__) && __GNUC__ >= 4 -# define CPL_UNUSED __attribute((__unused__)) -#else -# define CPL_UNUSED #endif -#endif - -#if defined(CPL_LSB) -#define bBigEndian FALSE -#elif defined(CPL_MSB) -#define bBigEndian TRUE -#else -static int bBigEndian; #endif -#ifdef __cplusplus -#define STATIC_CAST(type,x) static_cast(x) -#define SHPLIB_NULLPTR nullptr -#else -#define STATIC_CAST(type,x) ((type)(x)) -#define SHPLIB_NULLPTR NULL +/* Allows customization of the message in vendored builds (such as GDAL) */ +#ifndef SHP_RESTORE_SHX_HINT_MESSAGE +#define SHP_RESTORE_SHX_HINT_MESSAGE \ + " Use SHPRestoreSHX() to restore or create it." #endif -/************************************************************************/ -/* SwapWord() */ -/* */ -/* Swap a 2, 4 or 8 byte word. */ -/************************************************************************/ - -static void SwapWord( int length, void * wordP ) - -{ - int i; - uchar temp; - - for( i=0; i < length/2; i++ ) - { - temp = STATIC_CAST(uchar*, wordP)[i]; - STATIC_CAST(uchar*, wordP)[i] = STATIC_CAST(uchar*, wordP)[length-i-1]; - STATIC_CAST(uchar*, wordP)[length-i-1] = temp; - } -} - -/************************************************************************/ -/* SfRealloc() */ -/* */ -/* A realloc cover function that will access a NULL pointer as */ -/* a valid input. */ -/************************************************************************/ - -static void * SfRealloc( void * pMem, int nNewSize ) - -{ - if( pMem == SHPLIB_NULLPTR ) - return malloc(nNewSize); - else - return realloc(pMem,nNewSize); -} - /************************************************************************/ /* SHPWriteHeader() */ /* */ -/* Write out a header for the .shp and .shx files as well as the */ -/* contents of the index (.shx) file. */ +/* Write out a header for the .shp and .shx files as well as the */ +/* contents of the index (.shx) file. */ /************************************************************************/ -void SHPAPI_CALL SHPWriteHeader( SHPHandle psSHP ) - +void SHPAPI_CALL SHPWriteHeader(SHPHandle psSHP) { - uchar abyHeader[100] = { 0 }; - int i; - int32 i32; - double dValue; - int32 *panSHX; - if (psSHP->fpSHX == SHPLIB_NULLPTR) { - psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed"); + psSHP->sHooks.Error("SHPWriteHeader failed : SHX file is closed"); return; } -/* -------------------------------------------------------------------- */ -/* Prepare header block for .shp file. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Prepare header block for .shp file. */ + /* -------------------------------------------------------------------- */ - abyHeader[2] = 0x27; /* magic cookie */ + unsigned char abyHeader[100] = {0}; + abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; - i32 = psSHP->nFileSize/2; /* file size */ - ByteCopy( &i32, abyHeader+24, 4 ); - if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); - - i32 = 1000; /* version */ - ByteCopy( &i32, abyHeader+28, 4 ); - if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + uint32_t i32 = psSHP->nFileSize / 2; /* file size */ + ByteCopy(&i32, abyHeader + 24, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 24); +#endif - i32 = psSHP->nShapeType; /* shape type */ - ByteCopy( &i32, abyHeader+32, 4 ); - if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + i32 = 1000; /* version */ + ByteCopy(&i32, abyHeader + 28, 4); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 28); +#endif - dValue = psSHP->adBoundsMin[0]; /* set bounds */ - ByteCopy( &dValue, abyHeader+36, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+36 ); + i32 = psSHP->nShapeType; /* shape type */ + ByteCopy(&i32, abyHeader + 32, 4); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 32); +#endif + double dValue = psSHP->adBoundsMin[0]; /* set bounds */ + ByteCopy(&dValue, abyHeader + 36, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 36); +#endif dValue = psSHP->adBoundsMin[1]; - ByteCopy( &dValue, abyHeader+44, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+44 ); - + ByteCopy(&dValue, abyHeader + 44, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 44); +#endif dValue = psSHP->adBoundsMax[0]; - ByteCopy( &dValue, abyHeader+52, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+52 ); + ByteCopy(&dValue, abyHeader + 52, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 52); +#endif dValue = psSHP->adBoundsMax[1]; - ByteCopy( &dValue, abyHeader+60, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+60 ); + ByteCopy(&dValue, abyHeader + 60, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 60); +#endif - dValue = psSHP->adBoundsMin[2]; /* z */ - ByteCopy( &dValue, abyHeader+68, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+68 ); + dValue = psSHP->adBoundsMin[2]; /* z */ + ByteCopy(&dValue, abyHeader + 68, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 68); +#endif dValue = psSHP->adBoundsMax[2]; - ByteCopy( &dValue, abyHeader+76, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+76 ); + ByteCopy(&dValue, abyHeader + 76, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 76); +#endif - dValue = psSHP->adBoundsMin[3]; /* m */ - ByteCopy( &dValue, abyHeader+84, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+84 ); + dValue = psSHP->adBoundsMin[3]; /* m */ + ByteCopy(&dValue, abyHeader + 84, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 84); +#endif dValue = psSHP->adBoundsMax[3]; - ByteCopy( &dValue, abyHeader+92, 8 ); - if( bBigEndian ) SwapWord( 8, abyHeader+92 ); + ByteCopy(&dValue, abyHeader + 92, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(abyHeader + 92); +#endif -/* -------------------------------------------------------------------- */ -/* Write .shp file header. */ -/* -------------------------------------------------------------------- */ - if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 - || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) + /* -------------------------------------------------------------------- */ + /* Write .shp file header. */ + /* -------------------------------------------------------------------- */ + if (psSHP->sHooks.FSeek(psSHP->fpSHP, 0, 0) != 0 || + psSHP->sHooks.FWrite(abyHeader, 100, 1, psSHP->fpSHP) != 1) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failure writing .shp header: %s", strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shp header: %s", strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); return; } -/* -------------------------------------------------------------------- */ -/* Prepare, and write .shx file header. */ -/* -------------------------------------------------------------------- */ - i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ - ByteCopy( &i32, abyHeader+24, 4 ); - if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + /* -------------------------------------------------------------------- */ + /* Prepare, and write .shx file header. */ + /* -------------------------------------------------------------------- */ + i32 = (psSHP->nRecords * 2 * sizeof(uint32_t) + 100) / 2; /* file size */ + ByteCopy(&i32, abyHeader + 24, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 24); +#endif - if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 - || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) + if (psSHP->sHooks.FSeek(psSHP->fpSHX, 0, 0) != 0 || + psSHP->sHooks.FWrite(abyHeader, 100, 1, psSHP->fpSHX) != 1) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failure writing .shx header: %s", strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shx header: %s", strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); return; } -/* -------------------------------------------------------------------- */ -/* Write out the .shx contents. */ -/* -------------------------------------------------------------------- */ - panSHX = STATIC_CAST(int32 *, malloc(sizeof(int32) * 2 * psSHP->nRecords)); - if( panSHX == SHPLIB_NULLPTR ) + /* -------------------------------------------------------------------- */ + /* Write out the .shx contents. */ + /* -------------------------------------------------------------------- */ + uint32_t *panSHX = + STATIC_CAST(uint32_t *, malloc(sizeof(uint32_t) * 2 * psSHP->nRecords)); + if (panSHX == SHPLIB_NULLPTR) { - psSHP->sHooks.Error( "Failure allocatin panSHX" ); + psSHP->sHooks.Error("Failure allocatin panSHX"); return; } - for( i = 0; i < psSHP->nRecords; i++ ) + for (int i = 0; i < psSHP->nRecords; i++) { - panSHX[i*2 ] = psSHP->panRecOffset[i]/2; - panSHX[i*2+1] = psSHP->panRecSize[i]/2; - if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); - if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); + panSHX[i * 2] = psSHP->panRecOffset[i] / 2; + panSHX[i * 2 + 1] = psSHP->panRecSize[i] / 2; +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(panSHX + i * 2); + SHP_SWAP32(panSHX + i * 2 + 1); +#endif } - if( STATIC_CAST(int, psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX )) - != psSHP->nRecords ) + if (STATIC_CAST(int, psSHP->sHooks.FWrite(panSHX, sizeof(uint32_t) * 2, + psSHP->nRecords, psSHP->fpSHX)) != + psSHP->nRecords) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failure writing .shx contents: %s", strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shx contents: %s", strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); } - free( panSHX ); + free(panSHX); -/* -------------------------------------------------------------------- */ -/* Flush to disk. */ -/* -------------------------------------------------------------------- */ - psSHP->sHooks.FFlush( psSHP->fpSHP ); - psSHP->sHooks.FFlush( psSHP->fpSHX ); + /* -------------------------------------------------------------------- */ + /* Flush to disk. */ + /* -------------------------------------------------------------------- */ + psSHP->sHooks.FFlush(psSHP->fpSHP); + psSHP->sHooks.FFlush(psSHP->fpSHX); } /************************************************************************/ /* SHPOpen() */ /************************************************************************/ -SHPHandle SHPAPI_CALL -SHPOpen( const char * pszLayer, const char * pszAccess ) - +SHPHandle SHPAPI_CALL SHPOpen(const char *pszLayer, const char *pszAccess) { SAHooks sHooks; - SASetupDefaultHooks( &sHooks ); + SASetupDefaultHooks(&sHooks); - return SHPOpenLL( pszLayer, pszAccess, &sHooks ); + return SHPOpenLL(pszLayer, pszAccess, &sHooks); } /************************************************************************/ /* SHPGetLenWithoutExtension() */ /************************************************************************/ -static int SHPGetLenWithoutExtension(const char* pszBasename) +static int SHPGetLenWithoutExtension(const char *pszBasename) { - int i; - int nLen = STATIC_CAST(int, strlen(pszBasename)); - for( i = nLen-1; - i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; - i-- ) + const int nLen = STATIC_CAST(int, strlen(pszBasename)); + for (int i = nLen - 1; + i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { - if( pszBasename[i] == '.' ) + if (pszBasename[i] == '.') { return i; } @@ -595,169 +256,156 @@ static int SHPGetLenWithoutExtension(const char* pszBasename) /* files or either file name. */ /************************************************************************/ -SHPHandle SHPAPI_CALL -SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) - +SHPHandle SHPAPI_CALL SHPOpenLL(const char *pszLayer, const char *pszAccess, + const SAHooks *psHooks) { - char *pszFullname; - SHPHandle psSHP; - - uchar *pabyBuf; - int i; - double dValue; - int bLazySHXLoading = FALSE; - int nLenWithoutExtension; - -/* -------------------------------------------------------------------- */ -/* Ensure the access string is one of the legal ones. We */ -/* ensure the result string indicates binary to avoid common */ -/* problems on Windows. */ -/* -------------------------------------------------------------------- */ - if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 - || strcmp(pszAccess,"r+") == 0 ) + /* -------------------------------------------------------------------- */ + /* Ensure the access string is one of the legal ones. We */ + /* ensure the result string indicates binary to avoid common */ + /* problems on Windows. */ + /* -------------------------------------------------------------------- */ + bool bLazySHXLoading = false; + if (strcmp(pszAccess, "rb+") == 0 || strcmp(pszAccess, "r+b") == 0 || + strcmp(pszAccess, "r+") == 0) + { pszAccess = "r+b"; + } else { bLazySHXLoading = strchr(pszAccess, 'l') != SHPLIB_NULLPTR; pszAccess = "rb"; } -/* -------------------------------------------------------------------- */ -/* Establish the byte order on this machine. */ -/* -------------------------------------------------------------------- */ -#if !defined(bBigEndian) - i = 1; - if( *((uchar *) &i) == 1 ) - bBigEndian = FALSE; - else - bBigEndian = TRUE; -#endif - -/* -------------------------------------------------------------------- */ -/* Initialize the info structure. */ -/* -------------------------------------------------------------------- */ - psSHP = STATIC_CAST(SHPHandle, calloc(sizeof(SHPInfo),1)); + /* -------------------------------------------------------------------- */ + /* Initialize the info structure. */ + /* -------------------------------------------------------------------- */ + SHPHandle psSHP = STATIC_CAST(SHPHandle, calloc(1, sizeof(SHPInfo))); psSHP->bUpdated = FALSE; - memcpy( &(psSHP->sHooks), psHooks, sizeof(SAHooks) ); - -/* -------------------------------------------------------------------- */ -/* Open the .shp and .shx files. Note that files pulled from */ -/* a PC to Unix with upper case filenames won't work! */ -/* -------------------------------------------------------------------- */ - nLenWithoutExtension = SHPGetLenWithoutExtension(pszLayer); - pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); + memcpy(&(psSHP->sHooks), psHooks, sizeof(SAHooks)); + + /* -------------------------------------------------------------------- */ + /* Open the .shp and .shx files. Note that files pulled from */ + /* a PC to Unix with upper case filenames won't work! */ + /* -------------------------------------------------------------------- */ + const int nLenWithoutExtension = SHPGetLenWithoutExtension(pszLayer); + char *pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); memcpy(pszFullname, pszLayer, nLenWithoutExtension); memcpy(pszFullname + nLenWithoutExtension, ".shp", 5); - psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); - if( psSHP->fpSHP == SHPLIB_NULLPTR ) + psSHP->fpSHP = + psSHP->sHooks.FOpen(pszFullname, pszAccess, psSHP->sHooks.pvUserData); + if (psSHP->fpSHP == SHPLIB_NULLPTR) { memcpy(pszFullname + nLenWithoutExtension, ".SHP", 5); - psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess, + psSHP->sHooks.pvUserData); } - if( psSHP->fpSHP == SHPLIB_NULLPTR ) + if (psSHP->fpSHP == SHPLIB_NULLPTR) { - size_t nMessageLen = strlen(pszFullname)*2+256; + const size_t nMessageLen = strlen(pszFullname) * 2 + 256; char *pszMessage = STATIC_CAST(char *, malloc(nMessageLen)); pszFullname[nLenWithoutExtension] = 0; - snprintf( pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", - pszFullname, pszFullname ); - psHooks->Error( pszMessage ); - free( pszMessage ); + snprintf(pszMessage, nMessageLen, + "Unable to open %s.shp or %s.SHP in %s mode.", pszFullname, + pszFullname, pszAccess); + psHooks->Error(pszMessage); + free(pszMessage); - free( psSHP ); - free( pszFullname ); + free(psSHP); + free(pszFullname); return SHPLIB_NULLPTR; } memcpy(pszFullname + nLenWithoutExtension, ".shx", 5); - psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); - if( psSHP->fpSHX == SHPLIB_NULLPTR ) + psSHP->fpSHX = + psSHP->sHooks.FOpen(pszFullname, pszAccess, psSHP->sHooks.pvUserData); + if (psSHP->fpSHX == SHPLIB_NULLPTR) { memcpy(pszFullname + nLenWithoutExtension, ".SHX", 5); - psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess, + psSHP->sHooks.pvUserData); } - if( psSHP->fpSHX == SHPLIB_NULLPTR ) + if (psSHP->fpSHX == SHPLIB_NULLPTR) { - size_t nMessageLen = strlen(pszFullname)*2+256; + const size_t nMessageLen = + 64 + strlen(pszFullname) * 2 + strlen(SHP_RESTORE_SHX_HINT_MESSAGE); char *pszMessage = STATIC_CAST(char *, malloc(nMessageLen)); pszFullname[nLenWithoutExtension] = 0; - snprintf( pszMessage, nMessageLen, "Unable to open %s.shx or %s.SHX. " - "Set SHAPE_RESTORE_SHX config option to YES to restore or " - "create it.", pszFullname, pszFullname ); - psHooks->Error( pszMessage ); - free( pszMessage ); - - psSHP->sHooks.FClose( psSHP->fpSHP ); - free( psSHP ); - free( pszFullname ); - return SHPLIB_NULLPTR ; + snprintf( + pszMessage, nMessageLen, + "Unable to open %s.shx or %s.SHX." SHP_RESTORE_SHX_HINT_MESSAGE, + pszFullname, pszFullname); + psHooks->Error(pszMessage); + free(pszMessage); + + psSHP->sHooks.FClose(psSHP->fpSHP); + free(psSHP); + free(pszFullname); + return SHPLIB_NULLPTR; } - free( pszFullname ); + free(pszFullname); -/* -------------------------------------------------------------------- */ -/* Read the file size from the SHP file. */ -/* -------------------------------------------------------------------- */ - pabyBuf = STATIC_CAST(uchar *, malloc(100)); - if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ) != 1 ) + /* -------------------------------------------------------------------- */ + /* Read the file size from the SHP file. */ + /* -------------------------------------------------------------------- */ + unsigned char *pabyBuf = STATIC_CAST(unsigned char *, malloc(100)); + if (psSHP->sHooks.FRead(pabyBuf, 100, 1, psSHP->fpSHP) != 1) { - psSHP->sHooks.Error( ".shp file is unreadable, or corrupt." ); - psSHP->sHooks.FClose( psSHP->fpSHP ); - psSHP->sHooks.FClose( psSHP->fpSHX ); - free( pabyBuf ); - free( psSHP ); + psSHP->sHooks.Error(".shp file is unreadable, or corrupt."); + psSHP->sHooks.FClose(psSHP->fpSHP); + psSHP->sHooks.FClose(psSHP->fpSHX); + free(pabyBuf); + free(psSHP); - return SHPLIB_NULLPTR ; + return SHPLIB_NULLPTR; } - psSHP->nFileSize = (STATIC_CAST(unsigned int, pabyBuf[24])<<24)|(pabyBuf[25]<<16)| - (pabyBuf[26]<<8)|pabyBuf[27]; - if( psSHP->nFileSize < UINT_MAX / 2 ) + psSHP->nFileSize = (STATIC_CAST(unsigned int, pabyBuf[24]) << 24) | + (pabyBuf[25] << 16) | (pabyBuf[26] << 8) | pabyBuf[27]; + if (psSHP->nFileSize < UINT_MAX / 2) psSHP->nFileSize *= 2; else psSHP->nFileSize = (UINT_MAX / 2) * 2; -/* -------------------------------------------------------------------- */ -/* Read SHX file Header info */ -/* -------------------------------------------------------------------- */ - if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHX ) != 1 - || pabyBuf[0] != 0 - || pabyBuf[1] != 0 - || pabyBuf[2] != 0x27 - || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) - { - psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); - psSHP->sHooks.FClose( psSHP->fpSHP ); - psSHP->sHooks.FClose( psSHP->fpSHX ); - free( pabyBuf ); - free( psSHP ); + /* -------------------------------------------------------------------- */ + /* Read SHX file Header info */ + /* -------------------------------------------------------------------- */ + if (psSHP->sHooks.FRead(pabyBuf, 100, 1, psSHP->fpSHX) != 1 || + pabyBuf[0] != 0 || pabyBuf[1] != 0 || pabyBuf[2] != 0x27 || + (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d)) + { + psSHP->sHooks.Error(".shx file is unreadable, or corrupt."); + psSHP->sHooks.FClose(psSHP->fpSHP); + psSHP->sHooks.FClose(psSHP->fpSHX); + free(pabyBuf); + free(psSHP); return SHPLIB_NULLPTR; } - psSHP->nRecords = pabyBuf[27]|(pabyBuf[26]<<8)|(pabyBuf[25]<<16)| - ((pabyBuf[24] & 0x7F)<<24); + psSHP->nRecords = pabyBuf[27] | (pabyBuf[26] << 8) | (pabyBuf[25] << 16) | + ((pabyBuf[24] & 0x7F) << 24); psSHP->nRecords = (psSHP->nRecords - 50) / 4; psSHP->nShapeType = pabyBuf[32]; - if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) + if (psSHP->nRecords < 0 || psSHP->nRecords > 256000000) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Record count in .shp header is %d, which seems\n" + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Record count in .shx header is %d, which seems\n" "unreasonable. Assuming header is corrupt.", - psSHP->nRecords ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); - psSHP->sHooks.FClose( psSHP->fpSHP ); - psSHP->sHooks.FClose( psSHP->fpSHX ); - free( psSHP ); + psSHP->nRecords); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); + psSHP->sHooks.FClose(psSHP->fpSHP); + psSHP->sHooks.FClose(psSHP->fpSHX); + free(psSHP); free(pabyBuf); return SHPLIB_NULLPTR; @@ -765,70 +413,90 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) /* If a lot of records are advertized, check that the file is big enough */ /* to hold them */ - if( psSHP->nRecords >= 1024 * 1024 ) + if (psSHP->nRecords >= 1024 * 1024) { - SAOffset nFileSize; - psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 2 ); - nFileSize = psSHP->sHooks.FTell( psSHP->fpSHX ); - if( nFileSize > 100 && - nFileSize/2 < STATIC_CAST(SAOffset, psSHP->nRecords * 4 + 50) ) + psSHP->sHooks.FSeek(psSHP->fpSHX, 0, 2); + const SAOffset nFileSize = psSHP->sHooks.FTell(psSHP->fpSHX); + if (nFileSize > 100 && + nFileSize / 2 < STATIC_CAST(SAOffset, psSHP->nRecords * 4 + 50)) { psSHP->nRecords = STATIC_CAST(int, (nFileSize - 100) / 8); } - psSHP->sHooks.FSeek( psSHP->fpSHX, 100, 0 ); + psSHP->sHooks.FSeek(psSHP->fpSHX, 100, 0); } -/* -------------------------------------------------------------------- */ -/* Read the bounds. */ -/* -------------------------------------------------------------------- */ - if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); - memcpy( &dValue, pabyBuf+36, 8 ); + /* -------------------------------------------------------------------- */ + /* Read the bounds. */ + /* -------------------------------------------------------------------- */ + double dValue; + +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 36); +#endif + memcpy(&dValue, pabyBuf + 36, 8); psSHP->adBoundsMin[0] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); - memcpy( &dValue, pabyBuf+44, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 44); +#endif + memcpy(&dValue, pabyBuf + 44, 8); psSHP->adBoundsMin[1] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); - memcpy( &dValue, pabyBuf+52, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 52); +#endif + memcpy(&dValue, pabyBuf + 52, 8); psSHP->adBoundsMax[0] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); - memcpy( &dValue, pabyBuf+60, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 60); +#endif + memcpy(&dValue, pabyBuf + 60, 8); psSHP->adBoundsMax[1] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ - memcpy( &dValue, pabyBuf+68, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 68); /* z */ +#endif + memcpy(&dValue, pabyBuf + 68, 8); psSHP->adBoundsMin[2] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); - memcpy( &dValue, pabyBuf+76, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 76); +#endif + memcpy(&dValue, pabyBuf + 76, 8); psSHP->adBoundsMax[2] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ - memcpy( &dValue, pabyBuf+84, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 84); /* z */ +#endif + memcpy(&dValue, pabyBuf + 84, 8); psSHP->adBoundsMin[3] = dValue; - if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); - memcpy( &dValue, pabyBuf+92, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyBuf + 92); +#endif + memcpy(&dValue, pabyBuf + 92, 8); psSHP->adBoundsMax[3] = dValue; - free( pabyBuf ); + free(pabyBuf); -/* -------------------------------------------------------------------- */ -/* Read the .shx file to get the offsets to each record in */ -/* the .shp file. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Read the .shx file to get the offsets to each record in */ + /* the .shp file. */ + /* -------------------------------------------------------------------- */ psSHP->nMaxRecords = psSHP->nRecords; - psSHP->panRecOffset = STATIC_CAST(unsigned int *, - malloc(sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) )); - psSHP->panRecSize = STATIC_CAST(unsigned int *, - malloc(sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) )); - if( bLazySHXLoading ) + psSHP->panRecOffset = + STATIC_CAST(unsigned int *, + malloc(sizeof(unsigned int) * MAX(1, psSHP->nMaxRecords))); + psSHP->panRecSize = + STATIC_CAST(unsigned int *, + malloc(sizeof(unsigned int) * MAX(1, psSHP->nMaxRecords))); + if (bLazySHXLoading) pabyBuf = SHPLIB_NULLPTR; else - pabyBuf = STATIC_CAST(uchar *, malloc(8 * MAX(1,psSHP->nRecords) )); + pabyBuf = + STATIC_CAST(unsigned char *, malloc(8 * MAX(1, psSHP->nRecords))); if (psSHP->panRecOffset == SHPLIB_NULLPTR || psSHP->panRecSize == SHPLIB_NULLPTR || @@ -836,47 +504,53 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Not enough memory to allocate requested memory (nRecords=%d).\n" - "Probably broken SHP file", - psSHP->nRecords ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); - psSHP->sHooks.FClose( psSHP->fpSHP ); - psSHP->sHooks.FClose( psSHP->fpSHX ); - if (psSHP->panRecOffset) free( psSHP->panRecOffset ); - if (psSHP->panRecSize) free( psSHP->panRecSize ); - if (pabyBuf) free( pabyBuf ); - free( psSHP ); + snprintf( + szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nRecords=%d).\n" + "Probably broken SHP file", + psSHP->nRecords); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); + psSHP->sHooks.FClose(psSHP->fpSHP); + psSHP->sHooks.FClose(psSHP->fpSHX); + if (psSHP->panRecOffset) + free(psSHP->panRecOffset); + if (psSHP->panRecSize) + free(psSHP->panRecSize); + if (pabyBuf) + free(pabyBuf); + free(psSHP); return SHPLIB_NULLPTR; } - if( bLazySHXLoading ) + if (bLazySHXLoading) { - memset(psSHP->panRecOffset, 0, sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); - memset(psSHP->panRecSize, 0, sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); - free( pabyBuf ); // sometimes make cppcheck happy, but - return( psSHP ); + memset(psSHP->panRecOffset, 0, + sizeof(unsigned int) * MAX(1, psSHP->nMaxRecords)); + memset(psSHP->panRecSize, 0, + sizeof(unsigned int) * MAX(1, psSHP->nMaxRecords)); + free(pabyBuf); // sometimes make cppcheck happy, but + return (psSHP); } - if( STATIC_CAST(int, psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX )) - != psSHP->nRecords ) + if (STATIC_CAST(int, psSHP->sHooks.FRead(pabyBuf, 8, psSHP->nRecords, + psSHP->fpSHX)) != psSHP->nRecords) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), + snprintf(szErrorMsg, sizeof(szErrorMsg), "Failed to read all values for %d records in .shx file: %s.", - psSHP->nRecords, strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + psSHP->nRecords, strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); /* SHX is short or unreadable for some reason. */ - psSHP->sHooks.FClose( psSHP->fpSHP ); - psSHP->sHooks.FClose( psSHP->fpSHX ); - free( psSHP->panRecOffset ); - free( psSHP->panRecSize ); - free( pabyBuf ); - free( psSHP ); + psSHP->sHooks.FClose(psSHP->fpSHP); + psSHP->sHooks.FClose(psSHP->fpSHX); + free(psSHP->panRecOffset); + free(psSHP->panRecSize); + free(pabyBuf); + free(psSHP); return SHPLIB_NULLPTR; } @@ -884,50 +558,52 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) /* In read-only mode, we can close the SHX now */ if (strcmp(pszAccess, "rb") == 0) { - psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->sHooks.FClose(psSHP->fpSHX); psSHP->fpSHX = SHPLIB_NULLPTR; } - for( i = 0; i < psSHP->nRecords; i++ ) + for (int i = 0; i < psSHP->nRecords; i++) { - unsigned int nOffset, nLength; - - memcpy( &nOffset, pabyBuf + i * 8, 4 ); - if( !bBigEndian ) SwapWord( 4, &nOffset ); + unsigned int nOffset; + memcpy(&nOffset, pabyBuf + i * 8, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nOffset); +#endif - memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); - if( !bBigEndian ) SwapWord( 4, &nLength ); + unsigned int nLength; + memcpy(&nLength, pabyBuf + i * 8 + 4, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nLength); +#endif - if( nOffset > STATIC_CAST(unsigned int, INT_MAX) ) + if (nOffset > STATIC_CAST(unsigned int, INT_MAX)) { char str[128]; - snprintf( str, sizeof(str), - "Invalid offset for entity %d", i); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), "Invalid offset for entity %d", i); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); SHPClose(psSHP); - free( pabyBuf ); + free(pabyBuf); return SHPLIB_NULLPTR; } - if( nLength > STATIC_CAST(unsigned int, INT_MAX / 2 - 4) ) + if (nLength > STATIC_CAST(unsigned int, INT_MAX / 2 - 4)) { char str[128]; - snprintf( str, sizeof(str), - "Invalid length for entity %d", i); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), "Invalid length for entity %d", i); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); SHPClose(psSHP); - free( pabyBuf ); + free(pabyBuf); return SHPLIB_NULLPTR; } - psSHP->panRecOffset[i] = nOffset*2; - psSHP->panRecSize[i] = nLength*2; + psSHP->panRecOffset[i] = nOffset * 2; + psSHP->panRecSize[i] = nLength * 2; } - free( pabyBuf ); + free(pabyBuf); - return( psSHP ); + return (psSHP); } /************************************************************************/ @@ -938,17 +614,16 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) /* in case when bRestoreSHX equals true. */ /************************************************************************/ -SHPHandle SHPAPI_CALL -SHPOpenLLEx( const char * pszLayer, const char * pszAccess, SAHooks *psHooks, - int bRestoreSHX ) - +SHPHandle SHPAPI_CALL SHPOpenLLEx(const char *pszLayer, const char *pszAccess, + const SAHooks *psHooks, int bRestoreSHX) { - if ( !bRestoreSHX ) return SHPOpenLL ( pszLayer, pszAccess, psHooks ); + if (!bRestoreSHX) + return SHPOpenLL(pszLayer, pszAccess, psHooks); else { - if ( SHPRestoreSHX ( pszLayer, pszAccess, psHooks ) ) + if (SHPRestoreSHX(pszLayer, pszAccess, psHooks)) { - return SHPOpenLL ( pszLayer, pszAccess, psHooks ); + return SHPOpenLL(pszLayer, pszAccess, psHooks); } } @@ -962,227 +637,268 @@ SHPOpenLLEx( const char * pszLayer, const char * pszAccess, SAHooks *psHooks, /* */ /************************************************************************/ -int SHPAPI_CALL -SHPRestoreSHX ( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) - +int SHPAPI_CALL SHPRestoreSHX(const char *pszLayer, const char *pszAccess, + const SAHooks *psHooks) { - char *pszFullname; - SAFile fpSHP, fpSHX; - - - uchar *pabyBuf; - int nLenWithoutExtension; - unsigned int nSHPFilesize; - - unsigned int nCurrentRecordOffset = 0; - unsigned int nCurrentSHPOffset = 100; - size_t nRealSHXContentSize = 100; - - const char pszSHXAccess[] = "w+b"; - char *pabySHXHeader; - char abyReadedRecord[8]; - unsigned int niRecord = 0; - unsigned int nRecordLength = 0; - unsigned int nRecordOffset = 50; - -/* -------------------------------------------------------------------- */ -/* Ensure the access string is one of the legal ones. We */ -/* ensure the result string indicates binary to avoid common */ -/* problems on Windows. */ -/* -------------------------------------------------------------------- */ - if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 - || strcmp(pszAccess,"r+") == 0 ) + /* -------------------------------------------------------------------- */ + /* Ensure the access string is one of the legal ones. We */ + /* ensure the result string indicates binary to avoid common */ + /* problems on Windows. */ + /* -------------------------------------------------------------------- */ + if (strcmp(pszAccess, "rb+") == 0 || strcmp(pszAccess, "r+b") == 0 || + strcmp(pszAccess, "r+") == 0) + { pszAccess = "r+b"; + } else { pszAccess = "rb"; } -/* -------------------------------------------------------------------- */ -/* Establish the byte order on this machine. */ -/* -------------------------------------------------------------------- */ -#if !defined(bBigEndian) - { - int i = 1; - if( *((uchar *) &i) == 1 ) - bBigEndian = FALSE; - else - bBigEndian = TRUE; - } -#endif - -/* -------------------------------------------------------------------- */ -/* Open the .shp file. Note that files pulled from */ -/* a PC to Unix with upper case filenames won't work! */ -/* -------------------------------------------------------------------- */ - nLenWithoutExtension = SHPGetLenWithoutExtension(pszLayer); - pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); + /* -------------------------------------------------------------------- */ + /* Open the .shp file. Note that files pulled from */ + /* a PC to Unix with upper case filenames won't work! */ + /* -------------------------------------------------------------------- */ + const int nLenWithoutExtension = SHPGetLenWithoutExtension(pszLayer); + char *pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); memcpy(pszFullname, pszLayer, nLenWithoutExtension); memcpy(pszFullname + nLenWithoutExtension, ".shp", 5); - fpSHP = psHooks->FOpen(pszFullname, pszAccess ); - if( fpSHP == SHPLIB_NULLPTR ) + SAFile fpSHP = psHooks->FOpen(pszFullname, pszAccess, psHooks->pvUserData); + if (fpSHP == SHPLIB_NULLPTR) { memcpy(pszFullname + nLenWithoutExtension, ".SHP", 5); - fpSHP = psHooks->FOpen(pszFullname, pszAccess ); + fpSHP = psHooks->FOpen(pszFullname, pszAccess, psHooks->pvUserData); } - if( fpSHP == SHPLIB_NULLPTR ) + if (fpSHP == SHPLIB_NULLPTR) { - size_t nMessageLen = strlen( pszFullname ) * 2 + 256; - char* pszMessage = STATIC_CAST(char *, malloc( nMessageLen )); + const size_t nMessageLen = strlen(pszFullname) * 2 + 256; + char *pszMessage = STATIC_CAST(char *, malloc(nMessageLen)); pszFullname[nLenWithoutExtension] = 0; - snprintf( pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", - pszFullname, pszFullname ); - psHooks->Error( pszMessage ); - free( pszMessage ); + snprintf(pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", + pszFullname, pszFullname); + psHooks->Error(pszMessage); + free(pszMessage); - free( pszFullname ); + free(pszFullname); - return( 0 ); + return (0); } -/* -------------------------------------------------------------------- */ -/* Read the file size from the SHP file. */ -/* -------------------------------------------------------------------- */ - pabyBuf = STATIC_CAST(uchar *, malloc(100)); - psHooks->FRead( pabyBuf, 100, 1, fpSHP ); + /* -------------------------------------------------------------------- */ + /* Read the file size from the SHP file. */ + /* -------------------------------------------------------------------- */ + unsigned char *pabyBuf = STATIC_CAST(unsigned char *, malloc(100)); + if (psHooks->FRead(pabyBuf, 100, 1, fpSHP) != 1) + { + psHooks->Error(".shp file is unreadable, or corrupt."); + psHooks->FClose(fpSHP); + + free(pabyBuf); + free(pszFullname); - nSHPFilesize = (STATIC_CAST(unsigned int, pabyBuf[24])<<24)|(pabyBuf[25]<<16)| - (pabyBuf[26]<<8)|pabyBuf[27]; - if( nSHPFilesize < UINT_MAX / 2 ) + return (0); + } + + unsigned int nSHPFilesize = (STATIC_CAST(unsigned int, pabyBuf[24]) << 24) | + (pabyBuf[25] << 16) | (pabyBuf[26] << 8) | + pabyBuf[27]; + if (nSHPFilesize < UINT_MAX / 2) nSHPFilesize *= 2; else nSHPFilesize = (UINT_MAX / 2) * 2; memcpy(pszFullname + nLenWithoutExtension, ".shx", 5); - fpSHX = psHooks->FOpen( pszFullname, pszSHXAccess ); - if( fpSHX == SHPLIB_NULLPTR ) + const char pszSHXAccess[] = "w+b"; + SAFile fpSHX = + psHooks->FOpen(pszFullname, pszSHXAccess, psHooks->pvUserData); + if (fpSHX == SHPLIB_NULLPTR) { - memcpy(pszFullname + nLenWithoutExtension, ".SHX", 5); - fpSHP = psHooks->FOpen(pszFullname, pszAccess ); - } - - if( fpSHX == SHPLIB_NULLPTR ) - { - size_t nMessageLen = strlen( pszFullname ) * 2 + 256; - char* pszMessage = STATIC_CAST(char *, malloc( nMessageLen )); + size_t nMessageLen = strlen(pszFullname) * 2 + 256; + char *pszMessage = STATIC_CAST(char *, malloc(nMessageLen)); pszFullname[nLenWithoutExtension] = 0; - snprintf( pszMessage, nMessageLen, - "Error opening file %s.shx or %s.SHX for writing", - pszFullname, pszFullname ); - psHooks->Error( pszMessage ); - free( pszMessage ); + snprintf(pszMessage, nMessageLen, + "Error opening file %s.shx for writing", pszFullname); + psHooks->Error(pszMessage); + free(pszMessage); - psHooks->FClose( fpSHX ); + psHooks->FClose(fpSHP); - free( pabyBuf ); - free( pszFullname ); + free(pabyBuf); + free(pszFullname); - return( 0 ); + return (0); } -/* -------------------------------------------------------------------- */ -/* Open SHX and create it using SHP file content. */ -/* -------------------------------------------------------------------- */ - psHooks->FSeek( fpSHP, 100, 0 ); - pabySHXHeader = STATIC_CAST(char *, malloc ( 100 )); - memcpy( pabySHXHeader, pabyBuf, 100 ); - psHooks->FWrite( pabySHXHeader, 100, 1, fpSHX ); + /* -------------------------------------------------------------------- */ + /* Open SHX and create it using SHP file content. */ + /* -------------------------------------------------------------------- */ + psHooks->FSeek(fpSHP, 100, 0); + char *pabySHXHeader = STATIC_CAST(char *, malloc(100)); + memcpy(pabySHXHeader, pabyBuf, 100); + psHooks->FWrite(pabySHXHeader, 100, 1, fpSHX); + free(pabyBuf); + + // unsigned int nCurrentRecordOffset = 0; + unsigned int nCurrentSHPOffset = 100; + unsigned int nRealSHXContentSize = 100; + int nRetCode = TRUE; + unsigned int nRecordOffset = 50; - while( nCurrentSHPOffset < nSHPFilesize ) + while (nCurrentSHPOffset < nSHPFilesize) { - if( psHooks->FRead( &niRecord, 4, 1, fpSHP ) == 1 && - psHooks->FRead( &nRecordLength, 4, 1, fpSHP ) == 1) + unsigned int niRecord = 0; + unsigned int nRecordLength = 0; + int nSHPType; + + if (psHooks->FRead(&niRecord, 4, 1, fpSHP) == 1 && + psHooks->FRead(&nRecordLength, 4, 1, fpSHP) == 1 && + psHooks->FRead(&nSHPType, 4, 1, fpSHP) == 1) { - if( !bBigEndian ) SwapWord( 4, &nRecordOffset ); - memcpy( abyReadedRecord, &nRecordOffset, 4 ); - memcpy( abyReadedRecord + 4, &nRecordLength, 4 ); + char abyReadRecord[8]; + unsigned int nRecordOffsetBE = nRecordOffset; + +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nRecordOffsetBE); +#endif + memcpy(abyReadRecord, &nRecordOffsetBE, 4); + memcpy(abyReadRecord + 4, &nRecordLength, 4); + +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nRecordLength); +#endif +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nSHPType); +#endif + + // Sanity check on record length + if (nRecordLength < 1 || + nRecordLength > (nSHPFilesize - (nCurrentSHPOffset + 8)) / 2) + { + char szErrorMsg[200]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Error parsing .shp to restore .shx. " + "Invalid record length = %u at record starting at " + "offset %u", + nRecordLength, nCurrentSHPOffset); + psHooks->Error(szErrorMsg); + + nRetCode = FALSE; + break; + } + + // Sanity check on record type + if (nSHPType != SHPT_NULL && nSHPType != SHPT_POINT && + nSHPType != SHPT_ARC && nSHPType != SHPT_POLYGON && + nSHPType != SHPT_MULTIPOINT && nSHPType != SHPT_POINTZ && + nSHPType != SHPT_ARCZ && nSHPType != SHPT_POLYGONZ && + nSHPType != SHPT_MULTIPOINTZ && nSHPType != SHPT_POINTM && + nSHPType != SHPT_ARCM && nSHPType != SHPT_POLYGONM && + nSHPType != SHPT_MULTIPOINTM && nSHPType != SHPT_MULTIPATCH) + { + char szErrorMsg[200]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Error parsing .shp to restore .shx. " + "Invalid shape type = %d at record starting at " + "offset %u", + nSHPType, nCurrentSHPOffset); + psHooks->Error(szErrorMsg); + + nRetCode = FALSE; + break; + } - psHooks->FWrite( abyReadedRecord, 8, 1, fpSHX ); + psHooks->FWrite(abyReadRecord, 8, 1, fpSHX); - if ( !bBigEndian ) SwapWord( 4, &nRecordOffset ); - if ( !bBigEndian ) SwapWord( 4, &nRecordLength ); nRecordOffset += nRecordLength + 4; - nCurrentRecordOffset += 8; + // nCurrentRecordOffset += 8; nCurrentSHPOffset += 8 + nRecordLength * 2; - psHooks->FSeek( fpSHP, nCurrentSHPOffset, 0 ); + psHooks->FSeek(fpSHP, nCurrentSHPOffset, 0); nRealSHXContentSize += 8; } else { - psHooks->Error( "Error parsing .shp to restore .shx" ); - - psHooks->FClose( fpSHX ); - psHooks->FClose( fpSHP ); - - free( pabySHXHeader ); - free( pszFullname ); + char szErrorMsg[200]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Error parsing .shp to restore .shx. " + "Cannot read first bytes of record starting at " + "offset %u", + nCurrentSHPOffset); + psHooks->Error(szErrorMsg); - return( 0 ); + nRetCode = FALSE; + break; } } + if (nRetCode && nCurrentSHPOffset != nSHPFilesize) + { + psHooks->Error("Error parsing .shp to restore .shx. " + "Not expected number of bytes"); + + nRetCode = FALSE; + } - nRealSHXContentSize /= 2; // Bytes counted -> WORDs - if( !bBigEndian ) SwapWord( 4, &nRealSHXContentSize ); - psHooks->FSeek( fpSHX, 24, 0 ); - psHooks->FWrite( &nRealSHXContentSize, 4, 1, fpSHX ); + nRealSHXContentSize /= 2; // Bytes counted -> WORDs +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nRealSHXContentSize); +#endif + + psHooks->FSeek(fpSHX, 24, 0); + psHooks->FWrite(&nRealSHXContentSize, 4, 1, fpSHX); - psHooks->FClose( fpSHP ); - psHooks->FClose( fpSHX ); + psHooks->FClose(fpSHP); + psHooks->FClose(fpSHX); - free ( pabyBuf ); - free ( pszFullname ); - free ( pabySHXHeader ); + free(pszFullname); + free(pabySHXHeader); - return( 1 ); + return nRetCode; } /************************************************************************/ /* SHPClose() */ -/* */ -/* Close the .shp and .shx files. */ +/* */ +/* Close the .shp and .shx files. */ /************************************************************************/ -void SHPAPI_CALL -SHPClose(SHPHandle psSHP ) - +void SHPAPI_CALL SHPClose(SHPHandle psSHP) { - if( psSHP == SHPLIB_NULLPTR ) + if (psSHP == SHPLIB_NULLPTR) return; -/* -------------------------------------------------------------------- */ -/* Update the header if we have modified anything. */ -/* -------------------------------------------------------------------- */ - if( psSHP->bUpdated ) - SHPWriteHeader( psSHP ); + /* -------------------------------------------------------------------- */ + /* Update the header if we have modified anything. */ + /* -------------------------------------------------------------------- */ + if (psSHP->bUpdated) + SHPWriteHeader(psSHP); -/* -------------------------------------------------------------------- */ -/* Free all resources, and close files. */ -/* -------------------------------------------------------------------- */ - free( psSHP->panRecOffset ); - free( psSHP->panRecSize ); + /* -------------------------------------------------------------------- */ + /* Free all resources, and close files. */ + /* -------------------------------------------------------------------- */ + free(psSHP->panRecOffset); + free(psSHP->panRecSize); - if ( psSHP->fpSHX != SHPLIB_NULLPTR) - psSHP->sHooks.FClose( psSHP->fpSHX ); - psSHP->sHooks.FClose( psSHP->fpSHP ); + if (psSHP->fpSHX != SHPLIB_NULLPTR) + psSHP->sHooks.FClose(psSHP->fpSHX); + psSHP->sHooks.FClose(psSHP->fpSHP); - if( psSHP->pabyRec != SHPLIB_NULLPTR ) + if (psSHP->pabyRec != SHPLIB_NULLPTR) { - free( psSHP->pabyRec ); + free(psSHP->pabyRec); } - if( psSHP->pabyObjectBuf != SHPLIB_NULLPTR ) + if (psSHP->pabyObjectBuf != SHPLIB_NULLPTR) { - free( psSHP->pabyObjectBuf ); + free(psSHP->pabyObjectBuf); } - if( psSHP->psCachedObject != SHPLIB_NULLPTR ) + if (psSHP->psCachedObject != SHPLIB_NULLPTR) { - free( psSHP->psCachedObject ); + free(psSHP->psCachedObject); } - free( psSHP ); + free(psSHP); } /************************************************************************/ @@ -1193,14 +909,15 @@ SHPClose(SHPHandle psSHP ) /* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ /* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ /* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ -void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ) +void SHPAPI_CALL SHPSetFastModeReadObject(SHPHandle hSHP, int bFastMode) { - if( bFastMode ) + if (bFastMode) { - if( hSHP->psCachedObject == SHPLIB_NULLPTR ) + if (hSHP->psCachedObject == SHPLIB_NULLPTR) { - hSHP->psCachedObject = STATIC_CAST(SHPObject*, calloc(1, sizeof(SHPObject))); - assert( hSHP->psCachedObject != SHPLIB_NULLPTR ); + hSHP->psCachedObject = + STATIC_CAST(SHPObject *, calloc(1, sizeof(SHPObject))); + assert(hSHP->psCachedObject != SHPLIB_NULLPTR); } } @@ -1213,27 +930,24 @@ void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ) /* Fetch general information about the shape file. */ /************************************************************************/ -void SHPAPI_CALL -SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, - double * padfMinBound, double * padfMaxBound ) - +void SHPAPI_CALL SHPGetInfo(const SHPHandle psSHP, int *pnEntities, + int *pnShapeType, double *padfMinBound, + double *padfMaxBound) { - int i; - - if( psSHP == SHPLIB_NULLPTR ) + if (psSHP == SHPLIB_NULLPTR) return; - if( pnEntities != SHPLIB_NULLPTR ) + if (pnEntities != SHPLIB_NULLPTR) *pnEntities = psSHP->nRecords; - if( pnShapeType != SHPLIB_NULLPTR ) + if (pnShapeType != SHPLIB_NULLPTR) *pnShapeType = psSHP->nShapeType; - for( i = 0; i < 4; i++ ) + for (int i = 0; i < 4; i++) { - if( padfMinBound != SHPLIB_NULLPTR ) + if (padfMinBound != SHPLIB_NULLPTR) padfMinBound[i] = psSHP->adBoundsMin[i]; - if( padfMaxBound != SHPLIB_NULLPTR ) + if (padfMaxBound != SHPLIB_NULLPTR) padfMaxBound[i] = psSHP->adBoundsMax[i]; } } @@ -1245,15 +959,13 @@ SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, /* shape file with read/write access. */ /************************************************************************/ -SHPHandle SHPAPI_CALL -SHPCreate( const char * pszLayer, int nShapeType ) - +SHPHandle SHPAPI_CALL SHPCreate(const char *pszLayer, int nShapeType) { SAHooks sHooks; - SASetupDefaultHooks( &sHooks ); + SASetupDefaultHooks(&sHooks); - return SHPCreateLL( pszLayer, nShapeType, &sHooks ); + return SHPCreateLL(pszLayer, nShapeType, &sHooks); } /************************************************************************/ @@ -1263,137 +975,149 @@ SHPCreate( const char * pszLayer, int nShapeType ) /* shape file with read/write access. */ /************************************************************************/ -SHPHandle SHPAPI_CALL -SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) - +SHPHandle SHPAPI_CALL SHPCreateLL(const char *pszLayer, int nShapeType, + const SAHooks *psHooks) { - char *pszFullname; - SAFile fpSHP; - SAFile fpSHX = SHPLIB_NULLPTR; - uchar abyHeader[100]; - int32 i32; - double dValue; - int nLenWithoutExtension; - -/* -------------------------------------------------------------------- */ -/* Establish the byte order on this system. */ -/* -------------------------------------------------------------------- */ -#if !defined(bBigEndian) - { - int i = 1; - if( *((uchar *) &i) == 1 ) - bBigEndian = FALSE; - else - bBigEndian = TRUE; - } -#endif - -/* -------------------------------------------------------------------- */ -/* Open the two files so we can write their headers. */ -/* -------------------------------------------------------------------- */ - nLenWithoutExtension = SHPGetLenWithoutExtension(pszLayer); - pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); + /* -------------------------------------------------------------------- */ + /* Open the two files so we can write their headers. */ + /* -------------------------------------------------------------------- */ + const int nLenWithoutExtension = SHPGetLenWithoutExtension(pszLayer); + char *pszFullname = STATIC_CAST(char *, malloc(nLenWithoutExtension + 5)); memcpy(pszFullname, pszLayer, nLenWithoutExtension); memcpy(pszFullname + nLenWithoutExtension, ".shp", 5); - fpSHP = psHooks->FOpen(pszFullname, "wb" ); - if( fpSHP == SHPLIB_NULLPTR ) + SAFile fpSHP = psHooks->FOpen(pszFullname, "w+b", psHooks->pvUserData); + if (fpSHP == SHPLIB_NULLPTR) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failed to create file %s: %s", - pszFullname, strerror(errno) ); - psHooks->Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), "Failed to create file %s: %s", + pszFullname, strerror(errno)); + psHooks->Error(szErrorMsg); - goto error; + free(pszFullname); + return SHPLIB_NULLPTR; } memcpy(pszFullname + nLenWithoutExtension, ".shx", 5); - fpSHX = psHooks->FOpen(pszFullname, "wb" ); - if( fpSHX == SHPLIB_NULLPTR ) + SAFile fpSHX = psHooks->FOpen(pszFullname, "w+b", psHooks->pvUserData); + if (fpSHX == SHPLIB_NULLPTR) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failed to create file %s: %s", - pszFullname, strerror(errno) ); - psHooks->Error( szErrorMsg ); - goto error; + snprintf(szErrorMsg, sizeof(szErrorMsg), "Failed to create file %s: %s", + pszFullname, strerror(errno)); + psHooks->Error(szErrorMsg); + + free(pszFullname); + psHooks->FClose(fpSHP); + return SHPLIB_NULLPTR; } - free( pszFullname ); pszFullname = SHPLIB_NULLPTR; + free(pszFullname); + pszFullname = SHPLIB_NULLPTR; -/* -------------------------------------------------------------------- */ -/* Prepare header block for .shp file. */ -/* -------------------------------------------------------------------- */ - memset( abyHeader, 0, sizeof(abyHeader) ); + /* -------------------------------------------------------------------- */ + /* Prepare header block for .shp file. */ + /* -------------------------------------------------------------------- */ + unsigned char abyHeader[100]; + memset(abyHeader, 0, sizeof(abyHeader)); - abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; - i32 = 50; /* file size */ - ByteCopy( &i32, abyHeader+24, 4 ); - if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + uint32_t i32 = 50; /* file size */ + ByteCopy(&i32, abyHeader + 24, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 24); +#endif - i32 = 1000; /* version */ - ByteCopy( &i32, abyHeader+28, 4 ); - if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + i32 = 1000; /* version */ + ByteCopy(&i32, abyHeader + 28, 4); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 28); +#endif - i32 = nShapeType; /* shape type */ - ByteCopy( &i32, abyHeader+32, 4 ); - if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + i32 = nShapeType; /* shape type */ + ByteCopy(&i32, abyHeader + 32, 4); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 32); +#endif - dValue = 0.0; /* set bounds */ - ByteCopy( &dValue, abyHeader+36, 8 ); - ByteCopy( &dValue, abyHeader+44, 8 ); - ByteCopy( &dValue, abyHeader+52, 8 ); - ByteCopy( &dValue, abyHeader+60, 8 ); + double dValue = 0.0; /* set bounds */ + ByteCopy(&dValue, abyHeader + 36, 8); + ByteCopy(&dValue, abyHeader + 44, 8); + ByteCopy(&dValue, abyHeader + 52, 8); + ByteCopy(&dValue, abyHeader + 60, 8); -/* -------------------------------------------------------------------- */ -/* Write .shp file header. */ -/* -------------------------------------------------------------------- */ - if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) + /* -------------------------------------------------------------------- */ + /* Write .shp file header. */ + /* -------------------------------------------------------------------- */ + if (psHooks->FWrite(abyHeader, 100, 1, fpSHP) != 1) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failed to write .shp header: %s", strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psHooks->Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Failed to write .shp header: %s", strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psHooks->Error(szErrorMsg); - goto error; + free(pszFullname); + psHooks->FClose(fpSHP); + psHooks->FClose(fpSHX); + return SHPLIB_NULLPTR; } -/* -------------------------------------------------------------------- */ -/* Prepare, and write .shx file header. */ -/* -------------------------------------------------------------------- */ - i32 = 50; /* file size */ - ByteCopy( &i32, abyHeader+24, 4 ); - if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + /* -------------------------------------------------------------------- */ + /* Prepare, and write .shx file header. */ + /* -------------------------------------------------------------------- */ + i32 = 50; /* file size */ + ByteCopy(&i32, abyHeader + 24, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(abyHeader + 24); +#endif - if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) + if (psHooks->FWrite(abyHeader, 100, 1, fpSHX) != 1) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Failure writing .shx header: %s", strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psHooks->Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shx header: %s", strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psHooks->Error(szErrorMsg); - goto error; + free(pszFullname); + psHooks->FClose(fpSHP); + psHooks->FClose(fpSHX); + return SHPLIB_NULLPTR; } -/* -------------------------------------------------------------------- */ -/* Close the files, and then open them as regular existing files. */ -/* -------------------------------------------------------------------- */ - psHooks->FClose( fpSHP ); - psHooks->FClose( fpSHX ); + SHPHandle psSHP = STATIC_CAST(SHPHandle, calloc(1, sizeof(SHPInfo))); - return( SHPOpenLL( pszLayer, "r+b", psHooks ) ); + psSHP->bUpdated = FALSE; + memcpy(&(psSHP->sHooks), psHooks, sizeof(SAHooks)); -error: - if (pszFullname) free(pszFullname); - if (fpSHP) psHooks->FClose( fpSHP ); - if (fpSHX) psHooks->FClose( fpSHX ); - return SHPLIB_NULLPTR; + psSHP->fpSHP = fpSHP; + psSHP->fpSHX = fpSHX; + psSHP->nShapeType = nShapeType; + psSHP->nFileSize = 100; + psSHP->panRecOffset = + STATIC_CAST(unsigned int *, malloc(sizeof(unsigned int))); + psSHP->panRecSize = + STATIC_CAST(unsigned int *, malloc(sizeof(unsigned int))); + + if (psSHP->panRecOffset == SHPLIB_NULLPTR || + psSHP->panRecSize == SHPLIB_NULLPTR) + { + psSHP->sHooks.Error("Not enough memory to allocate requested memory"); + psSHP->sHooks.FClose(psSHP->fpSHP); + psSHP->sHooks.FClose(psSHP->fpSHX); + if (psSHP->panRecOffset) + free(psSHP->panRecOffset); + if (psSHP->panRecSize) + free(psSHP->panRecSize); + free(psSHP); + return SHPLIB_NULLPTR; + } + + return psSHP; } /************************************************************************/ @@ -1403,21 +1127,19 @@ SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) /* indicated location in the record. */ /************************************************************************/ -static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) - +static void _SHPSetBounds(unsigned char *pabyRec, const SHPObject *psShape) { - ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); - ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); - ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); - ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); - - if( bBigEndian ) - { - SwapWord( 8, pabyRec + 0 ); - SwapWord( 8, pabyRec + 8 ); - SwapWord( 8, pabyRec + 16 ); - SwapWord( 8, pabyRec + 24 ); - } + ByteCopy(&(psShape->dfXMin), pabyRec + 0, 8); + ByteCopy(&(psShape->dfYMin), pabyRec + 8, 8); + ByteCopy(&(psShape->dfXMax), pabyRec + 16, 8); + ByteCopy(&(psShape->dfYMax), pabyRec + 24, 8); + +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + 0); + SHP_SWAP64(pabyRec + 8); + SHP_SWAP64(pabyRec + 16); + SHP_SWAP64(pabyRec + 24); +#endif } /************************************************************************/ @@ -1427,16 +1149,12 @@ static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) /* SHPCreateObject(). */ /************************************************************************/ -void SHPAPI_CALL -SHPComputeExtents( SHPObject * psObject ) - +void SHPAPI_CALL SHPComputeExtents(SHPObject *psObject) { - int i; - -/* -------------------------------------------------------------------- */ -/* Build extents for this object. */ -/* -------------------------------------------------------------------- */ - if( psObject->nVertices > 0 ) + /* -------------------------------------------------------------------- */ + /* Build extents for this object. */ + /* -------------------------------------------------------------------- */ + if (psObject->nVertices > 0) { psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; @@ -1444,7 +1162,7 @@ SHPComputeExtents( SHPObject * psObject ) psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; } - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); @@ -1466,114 +1184,113 @@ SHPComputeExtents( SHPObject * psObject ) /************************************************************************/ SHPObject SHPAPI_CALL1(*) -SHPCreateObject( int nSHPType, int nShapeId, int nParts, - const int * panPartStart, const int * panPartType, - int nVertices, const double *padfX, const double *padfY, - const double * padfZ, const double * padfM ) - + SHPCreateObject(int nSHPType, int nShapeId, int nParts, + const int *panPartStart, const int *panPartType, + int nVertices, const double *padfX, const double *padfY, + const double *padfZ, const double *padfM) { - SHPObject *psObject; - int i, bHasM, bHasZ; - - psObject = STATIC_CAST(SHPObject *, calloc(1,sizeof(SHPObject))); + SHPObject *psObject = + STATIC_CAST(SHPObject *, calloc(1, sizeof(SHPObject))); psObject->nSHPType = nSHPType; psObject->nShapeId = nShapeId; psObject->bMeasureIsUsed = FALSE; -/* -------------------------------------------------------------------- */ -/* Establish whether this shape type has M, and Z values. */ -/* -------------------------------------------------------------------- */ - if( nSHPType == SHPT_ARCM - || nSHPType == SHPT_POINTM - || nSHPType == SHPT_POLYGONM - || nSHPType == SHPT_MULTIPOINTM ) + /* -------------------------------------------------------------------- */ + /* Establish whether this shape type has M, and Z values. */ + /* -------------------------------------------------------------------- */ + bool bHasM; + bool bHasZ; + + if (nSHPType == SHPT_ARCM || nSHPType == SHPT_POINTM || + nSHPType == SHPT_POLYGONM || nSHPType == SHPT_MULTIPOINTM) { - bHasM = TRUE; - bHasZ = FALSE; + bHasM = true; + bHasZ = false; } - else if( nSHPType == SHPT_ARCZ - || nSHPType == SHPT_POINTZ - || nSHPType == SHPT_POLYGONZ - || nSHPType == SHPT_MULTIPOINTZ - || nSHPType == SHPT_MULTIPATCH ) + else if (nSHPType == SHPT_ARCZ || nSHPType == SHPT_POINTZ || + nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPOINTZ || + nSHPType == SHPT_MULTIPATCH) { - bHasM = TRUE; - bHasZ = TRUE; + bHasM = true; + bHasZ = true; } else { - bHasM = FALSE; - bHasZ = FALSE; + bHasM = false; + bHasZ = false; } -/* -------------------------------------------------------------------- */ -/* Capture parts. Note that part type is optional, and */ -/* defaults to ring. */ -/* -------------------------------------------------------------------- */ - if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON - || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM - || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ - || nSHPType == SHPT_MULTIPATCH ) + /* -------------------------------------------------------------------- */ + /* Capture parts. Note that part type is optional, and */ + /* defaults to ring. */ + /* -------------------------------------------------------------------- */ + if (nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON || + nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM || + nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ || + nSHPType == SHPT_MULTIPATCH) { - psObject->nParts = MAX(1,nParts); + psObject->nParts = MAX(1, nParts); - psObject->panPartStart = STATIC_CAST(int *, - calloc(sizeof(int), psObject->nParts)); - psObject->panPartType = STATIC_CAST(int *, - malloc(sizeof(int) * psObject->nParts)); + psObject->panPartStart = + STATIC_CAST(int *, calloc(psObject->nParts, sizeof(int))); + psObject->panPartType = + STATIC_CAST(int *, malloc(sizeof(int) * psObject->nParts)); psObject->panPartStart[0] = 0; psObject->panPartType[0] = SHPP_RING; - for( i = 0; i < nParts; i++ ) + for (int i = 0; i < nParts; i++) { - if( panPartStart != SHPLIB_NULLPTR ) + if (panPartStart != SHPLIB_NULLPTR) psObject->panPartStart[i] = panPartStart[i]; - if( panPartType != SHPLIB_NULLPTR ) + if (panPartType != SHPLIB_NULLPTR) psObject->panPartType[i] = panPartType[i]; else psObject->panPartType[i] = SHPP_RING; } - if( psObject->panPartStart[0] != 0 ) - psObject->panPartStart[0] = 0; + psObject->panPartStart[0] = 0; } -/* -------------------------------------------------------------------- */ -/* Capture vertices. Note that X, Y, Z and M are optional. */ -/* -------------------------------------------------------------------- */ - if( nVertices > 0 ) - { - size_t nSize = sizeof(double) * nVertices; - psObject->padfX = STATIC_CAST(double *, padfX ? malloc(nSize) : - calloc(sizeof(double),nVertices)); - psObject->padfY = STATIC_CAST(double *, padfY ? malloc(nSize) : - calloc(sizeof(double),nVertices)); - psObject->padfZ = STATIC_CAST(double *, padfZ && bHasZ ? malloc(nSize) : - calloc(sizeof(double),nVertices)); - psObject->padfM = STATIC_CAST(double *, padfM && bHasM ? malloc(nSize) : - calloc(sizeof(double),nVertices)); - if( padfX != SHPLIB_NULLPTR ) + /* -------------------------------------------------------------------- */ + /* Capture vertices. Note that X, Y, Z and M are optional. */ + /* -------------------------------------------------------------------- */ + if (nVertices > 0) + { + const size_t nSize = sizeof(double) * nVertices; + psObject->padfX = + STATIC_CAST(double *, padfX ? malloc(nSize) + : calloc(nVertices, sizeof(double))); + psObject->padfY = + STATIC_CAST(double *, padfY ? malloc(nSize) + : calloc(nVertices, sizeof(double))); + psObject->padfZ = STATIC_CAST( + double *, + padfZ &&bHasZ ? malloc(nSize) : calloc(nVertices, sizeof(double))); + psObject->padfM = STATIC_CAST( + double *, + padfM &&bHasM ? malloc(nSize) : calloc(nVertices, sizeof(double))); + if (padfX != SHPLIB_NULLPTR) memcpy(psObject->padfX, padfX, nSize); - if( padfY != SHPLIB_NULLPTR ) + if (padfY != SHPLIB_NULLPTR) memcpy(psObject->padfY, padfY, nSize); - if( padfZ != SHPLIB_NULLPTR && bHasZ ) + if (padfZ != SHPLIB_NULLPTR && bHasZ) memcpy(psObject->padfZ, padfZ, nSize); - if( padfM != SHPLIB_NULLPTR && bHasM ) + if (padfM != SHPLIB_NULLPTR && bHasM) { memcpy(psObject->padfM, padfM, nSize); psObject->bMeasureIsUsed = TRUE; } } -/* -------------------------------------------------------------------- */ -/* Compute the extents. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Compute the extents. */ + /* -------------------------------------------------------------------- */ psObject->nVertices = nVertices; - SHPComputeExtents( psObject ); + SHPComputeExtents(psObject); - return( psObject ); + return (psObject); } /************************************************************************/ @@ -1584,13 +1301,11 @@ SHPCreateObject( int nSHPType, int nShapeId, int nParts, /************************************************************************/ SHPObject SHPAPI_CALL1(*) -SHPCreateSimpleObject( int nSHPType, int nVertices, - const double * padfX, const double * padfY, - const double * padfZ ) - + SHPCreateSimpleObject(int nSHPType, int nVertices, const double *padfX, + const double *padfY, const double *padfZ) { - return( SHPCreateObject( nSHPType, -1, 0, SHPLIB_NULLPTR, SHPLIB_NULLPTR, - nVertices, padfX, padfY, padfZ, SHPLIB_NULLPTR ) ); + return (SHPCreateObject(nSHPType, -1, 0, SHPLIB_NULLPTR, SHPLIB_NULLPTR, + nVertices, padfX, padfY, padfZ, SHPLIB_NULLPTR)); } /************************************************************************/ @@ -1600,116 +1315,143 @@ SHPCreateSimpleObject( int nSHPType, int nVertices, /* only possible to write vertices at the end of the file. */ /************************************************************************/ -int SHPAPI_CALL -SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) - +int SHPAPI_CALL SHPWriteObject(SHPHandle psSHP, int nShapeId, + const SHPObject *psObject) { - unsigned int nRecordOffset, nRecordSize=0; - int i; - uchar *pabyRec; - int32 i32; - int bAppendToLastRecord = FALSE; - int bAppendToFile = FALSE; - psSHP->bUpdated = TRUE; -/* -------------------------------------------------------------------- */ -/* Ensure that shape object matches the type of the file it is */ -/* being written to. */ -/* -------------------------------------------------------------------- */ - assert( psObject->nSHPType == psSHP->nShapeType - || psObject->nSHPType == SHPT_NULL ); - -/* -------------------------------------------------------------------- */ -/* Ensure that -1 is used for appends. Either blow an */ -/* assertion, or if they are disabled, set the shapeid to -1 */ -/* for appends. */ -/* -------------------------------------------------------------------- */ - assert( nShapeId == -1 - || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); - - if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) + /* -------------------------------------------------------------------- */ + /* Ensure that shape object matches the type of the file it is */ + /* being written to. */ + /* -------------------------------------------------------------------- */ + assert(psObject->nSHPType == psSHP->nShapeType || + psObject->nSHPType == SHPT_NULL); + + /* -------------------------------------------------------------------- */ + /* Ensure that -1 is used for appends. Either blow an */ + /* assertion, or if they are disabled, set the shapeid to -1 */ + /* for appends. */ + /* -------------------------------------------------------------------- */ + assert(nShapeId == -1 || (nShapeId >= 0 && nShapeId < psSHP->nRecords)); + + if (nShapeId != -1 && nShapeId >= psSHP->nRecords) nShapeId = -1; -/* -------------------------------------------------------------------- */ -/* Add the new entity to the in memory index. */ -/* -------------------------------------------------------------------- */ - if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) + /* -------------------------------------------------------------------- */ + /* Add the new entity to the in memory index. */ + /* -------------------------------------------------------------------- */ + if (nShapeId == -1 && psSHP->nRecords + 1 > psSHP->nMaxRecords) { + /* This cannot overflow given that we check that the file size does + * not grow over 4 GB, and the minimum size of a record is 12 bytes, + * hence the maximm value for nMaxRecords is 357,913,941 + */ int nNewMaxRecords = psSHP->nMaxRecords + psSHP->nMaxRecords / 3 + 100; - unsigned int* panRecOffsetNew; - unsigned int* panRecSizeNew; + unsigned int *panRecOffsetNew; + unsigned int *panRecSizeNew; - panRecOffsetNew = STATIC_CAST(unsigned int *, - SfRealloc(psSHP->panRecOffset,sizeof(unsigned int) * nNewMaxRecords )); - if( panRecOffsetNew == SHPLIB_NULLPTR ) + panRecOffsetNew = STATIC_CAST( + unsigned int *, realloc(psSHP->panRecOffset, + sizeof(unsigned int) * nNewMaxRecords)); + if (panRecOffsetNew == SHPLIB_NULLPTR) + { + psSHP->sHooks.Error("Failed to write shape object. " + "Memory allocation error."); return -1; + } psSHP->panRecOffset = panRecOffsetNew; - panRecSizeNew = STATIC_CAST(unsigned int *, - SfRealloc(psSHP->panRecSize,sizeof(unsigned int) * nNewMaxRecords )); - if( panRecSizeNew == SHPLIB_NULLPTR ) + panRecSizeNew = STATIC_CAST( + unsigned int *, + realloc(psSHP->panRecSize, sizeof(unsigned int) * nNewMaxRecords)); + if (panRecSizeNew == SHPLIB_NULLPTR) + { + psSHP->sHooks.Error("Failed to write shape object. " + "Memory allocation error."); return -1; + } psSHP->panRecSize = panRecSizeNew; psSHP->nMaxRecords = nNewMaxRecords; } -/* -------------------------------------------------------------------- */ -/* Initialize record. */ -/* -------------------------------------------------------------------- */ - pabyRec = STATIC_CAST(uchar *, malloc(psObject->nVertices * 4 * sizeof(double) - + psObject->nParts * 8 + 128)); - if( pabyRec == SHPLIB_NULLPTR ) - return -1; + /* -------------------------------------------------------------------- */ + /* Initialize record. */ + /* -------------------------------------------------------------------- */ -/* -------------------------------------------------------------------- */ -/* Extract vertices for a Polygon or Arc. */ -/* -------------------------------------------------------------------- */ - if( psObject->nSHPType == SHPT_POLYGON - || psObject->nSHPType == SHPT_POLYGONZ - || psObject->nSHPType == SHPT_POLYGONM - || psObject->nSHPType == SHPT_ARC - || psObject->nSHPType == SHPT_ARCZ - || psObject->nSHPType == SHPT_ARCM - || psObject->nSHPType == SHPT_MULTIPATCH ) + /* The following computation cannot overflow on 32-bit platforms given that + * the user had to allocate arrays of at least that size. */ + size_t nRecMaxSize = + psObject->nVertices * 4 * sizeof(double) + psObject->nParts * 8; + /* But the following test could trigger on 64-bit platforms on huge + * geometries. */ + const unsigned nExtraSpaceForGeomHeader = 128; + if (nRecMaxSize > UINT_MAX - nExtraSpaceForGeomHeader) { - int32 nPoints, nParts; + psSHP->sHooks.Error("Failed to write shape object. Too big geometry."); + return -1; + } + nRecMaxSize += nExtraSpaceForGeomHeader; + unsigned char *pabyRec = STATIC_CAST(unsigned char *, malloc(nRecMaxSize)); + if (pabyRec == SHPLIB_NULLPTR) + { + psSHP->sHooks.Error("Failed to write shape object. " + "Memory allocation error."); + return -1; + } - nPoints = psObject->nVertices; - nParts = psObject->nParts; + /* -------------------------------------------------------------------- */ + /* Extract vertices for a Polygon or Arc. */ + /* -------------------------------------------------------------------- */ + unsigned int nRecordSize = 0; + const bool bFirstFeature = psSHP->nRecords == 0; - _SHPSetBounds( pabyRec + 12, psObject ); + if (psObject->nSHPType == SHPT_POLYGON || + psObject->nSHPType == SHPT_POLYGONZ || + psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARC || + psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_ARCM || + psObject->nSHPType == SHPT_MULTIPATCH) + { + uint32_t nPoints = psObject->nVertices; + uint32_t nParts = psObject->nParts; + + _SHPSetBounds(pabyRec + 12, psObject); - if( bBigEndian ) SwapWord( 4, &nPoints ); - if( bBigEndian ) SwapWord( 4, &nParts ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nPoints); + SHP_SWAP32(&nParts); +#endif - ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); - ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); + ByteCopy(&nPoints, pabyRec + 40 + 8, 4); + ByteCopy(&nParts, pabyRec + 36 + 8, 4); nRecordSize = 52; /* * Write part start positions. */ - ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, - 4 * psObject->nParts ); - for( i = 0; i < psObject->nParts; i++ ) + ByteCopy(psObject->panPartStart, pabyRec + 44 + 8, + 4 * psObject->nParts); + for (int i = 0; i < psObject->nParts; i++) { - if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(pabyRec + 44 + 8 + 4 * i); +#endif nRecordSize += 4; } /* * Write multipatch part types if needed. */ - if( psObject->nSHPType == SHPT_MULTIPATCH ) + if (psObject->nSHPType == SHPT_MULTIPATCH) { - memcpy( pabyRec + nRecordSize, psObject->panPartType, - 4*psObject->nParts ); - for( i = 0; i < psObject->nParts; i++ ) + memcpy(pabyRec + nRecordSize, psObject->panPartType, + 4 * psObject->nParts); + for (int i = 0; i < psObject->nParts; i++) { - if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(pabyRec + nRecordSize); +#endif nRecordSize += 4; } } @@ -1717,16 +1459,15 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) /* * Write the (x,y) vertex values. */ - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); - ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); + ByteCopy(psObject->padfX + i, pabyRec + nRecordSize, 8); + ByteCopy(psObject->padfY + i, pabyRec + nRecordSize + 8, 8); - if( bBigEndian ) - SwapWord( 8, pabyRec + nRecordSize ); - - if( bBigEndian ) - SwapWord( 8, pabyRec + nRecordSize + 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); + SHP_SWAP64(pabyRec + nRecordSize + 8); +#endif nRecordSize += 2 * 8; } @@ -1734,22 +1475,28 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) /* * Write the Z coordinates (if any). */ - if( psObject->nSHPType == SHPT_POLYGONZ - || psObject->nSHPType == SHPT_ARCZ - || psObject->nSHPType == SHPT_MULTIPATCH ) + if (psObject->nSHPType == SHPT_POLYGONZ || + psObject->nSHPType == SHPT_ARCZ || + psObject->nSHPType == SHPT_MULTIPATCH) { - ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfZMin), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfZMax), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(psObject->padfZ + i, pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; } } @@ -1757,172 +1504,202 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) /* * Write the M values, if any. */ - if( psObject->bMeasureIsUsed - && (psObject->nSHPType == SHPT_POLYGONM - || psObject->nSHPType == SHPT_ARCM + if (psObject->bMeasureIsUsed && + (psObject->nSHPType == SHPT_POLYGONM || + psObject->nSHPType == SHPT_ARCM #ifndef DISABLE_MULTIPATCH_MEASURE - || psObject->nSHPType == SHPT_MULTIPATCH + || psObject->nSHPType == SHPT_MULTIPATCH #endif - || psObject->nSHPType == SHPT_POLYGONZ - || psObject->nSHPType == SHPT_ARCZ) ) + || psObject->nSHPType == SHPT_POLYGONZ || + psObject->nSHPType == SHPT_ARCZ)) { - ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfMMin), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfMMax), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(psObject->padfM + i, pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; } } } -/* -------------------------------------------------------------------- */ -/* Extract vertices for a MultiPoint. */ -/* -------------------------------------------------------------------- */ - else if( psObject->nSHPType == SHPT_MULTIPOINT - || psObject->nSHPType == SHPT_MULTIPOINTZ - || psObject->nSHPType == SHPT_MULTIPOINTM ) + /* -------------------------------------------------------------------- */ + /* Extract vertices for a MultiPoint. */ + /* -------------------------------------------------------------------- */ + else if (psObject->nSHPType == SHPT_MULTIPOINT || + psObject->nSHPType == SHPT_MULTIPOINTZ || + psObject->nSHPType == SHPT_MULTIPOINTM) { - int32 nPoints; + uint32_t nPoints = psObject->nVertices; - nPoints = psObject->nVertices; + _SHPSetBounds(pabyRec + 12, psObject); - _SHPSetBounds( pabyRec + 12, psObject ); - - if( bBigEndian ) SwapWord( 4, &nPoints ); - ByteCopy( &nPoints, pabyRec + 44, 4 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nPoints); +#endif + ByteCopy(&nPoints, pabyRec + 44, 4); - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); - ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); + ByteCopy(psObject->padfX + i, pabyRec + 48 + i * 16, 8); + ByteCopy(psObject->padfY + i, pabyRec + 48 + i * 16 + 8, 8); - if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); - if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + 48 + i * 16); + SHP_SWAP64(pabyRec + 48 + i * 16 + 8); +#endif } nRecordSize = 48 + 16 * psObject->nVertices; - if( psObject->nSHPType == SHPT_MULTIPOINTZ ) + if (psObject->nSHPType == SHPT_MULTIPOINTZ) { - ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfZMin), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfZMax), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(psObject->padfZ + i, pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; } } - if( psObject->bMeasureIsUsed - && (psObject->nSHPType == SHPT_MULTIPOINTZ - || psObject->nSHPType == SHPT_MULTIPOINTM) ) + if (psObject->bMeasureIsUsed && + (psObject->nSHPType == SHPT_MULTIPOINTZ || + psObject->nSHPType == SHPT_MULTIPOINTM)) { - ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfMMin), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(&(psObject->dfMMax), pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(psObject->padfM + i, pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; } } } -/* -------------------------------------------------------------------- */ -/* Write point. */ -/* -------------------------------------------------------------------- */ - else if( psObject->nSHPType == SHPT_POINT - || psObject->nSHPType == SHPT_POINTZ - || psObject->nSHPType == SHPT_POINTM ) + /* -------------------------------------------------------------------- */ + /* Write point. */ + /* -------------------------------------------------------------------- */ + else if (psObject->nSHPType == SHPT_POINT || + psObject->nSHPType == SHPT_POINTZ || + psObject->nSHPType == SHPT_POINTM) { - ByteCopy( psObject->padfX, pabyRec + 12, 8 ); - ByteCopy( psObject->padfY, pabyRec + 20, 8 ); + ByteCopy(psObject->padfX, pabyRec + 12, 8); + ByteCopy(psObject->padfY, pabyRec + 20, 8); - if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); - if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + 12); + SHP_SWAP64(pabyRec + 20); +#endif nRecordSize = 28; - if( psObject->nSHPType == SHPT_POINTZ ) + if (psObject->nSHPType == SHPT_POINTZ) { - ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(psObject->padfZ, pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; } - if( psObject->bMeasureIsUsed - && (psObject->nSHPType == SHPT_POINTZ - || psObject->nSHPType == SHPT_POINTM) ) + if (psObject->bMeasureIsUsed && (psObject->nSHPType == SHPT_POINTZ || + psObject->nSHPType == SHPT_POINTM)) { - ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); - if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + ByteCopy(psObject->padfM, pabyRec + nRecordSize, 8); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP64(pabyRec + nRecordSize); +#endif nRecordSize += 8; } } -/* -------------------------------------------------------------------- */ -/* Not much to do for null geometries. */ -/* -------------------------------------------------------------------- */ - else if( psObject->nSHPType == SHPT_NULL ) + /* -------------------------------------------------------------------- */ + /* Not much to do for null geometries. */ + /* -------------------------------------------------------------------- */ + else if (psObject->nSHPType == SHPT_NULL) { nRecordSize = 12; } - else { /* unknown type */ - assert( FALSE ); - } - -/* -------------------------------------------------------------------- */ -/* Establish where we are going to put this record. If we are */ -/* rewriting the last record of the file, then we can update it in */ -/* place. Otherwise if rewriting an existing record, and it will */ -/* fit, then put it back where the original came from. Otherwise */ -/* write at the end. */ -/* -------------------------------------------------------------------- */ - if( nShapeId != -1 && psSHP->panRecOffset[nShapeId] + - psSHP->panRecSize[nShapeId] + 8 == psSHP->nFileSize ) + assert(false); + } + + /* -------------------------------------------------------------------- */ + /* Establish where we are going to put this record. If we are */ + /* rewriting the last record of the file, then we can update it in */ + /* place. Otherwise if rewriting an existing record, and it will */ + /* fit, then put it back where the original came from. Otherwise */ + /* write at the end. */ + /* -------------------------------------------------------------------- */ + SAOffset nRecordOffset; + bool bAppendToLastRecord = false; + bool bAppendToFile = false; + if (nShapeId != -1 && + psSHP->panRecOffset[nShapeId] + psSHP->panRecSize[nShapeId] + 8 == + psSHP->nFileSize) { nRecordOffset = psSHP->panRecOffset[nShapeId]; - bAppendToLastRecord = TRUE; + bAppendToLastRecord = true; } - else if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) + else if (nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize - 8) { - if( psSHP->nFileSize > UINT_MAX - nRecordSize) + if (psSHP->nFileSize > UINT_MAX - nRecordSize) { - char str[128]; - snprintf( str, sizeof(str), "Failed to write shape object. " - "File size cannot reach %u + %u.", - psSHP->nFileSize, nRecordSize ); - str[sizeof(str)-1] = '\0'; - psSHP->sHooks.Error( str ); - free( pabyRec ); + char str[255]; + snprintf(str, sizeof(str), + "Failed to write shape object. " + "The maximum file size of %u has been reached. " + "The current record of size %u cannot be added.", + psSHP->nFileSize, nRecordSize); + str[sizeof(str) - 1] = '\0'; + psSHP->sHooks.Error(str); + free(pabyRec); return -1; } - bAppendToFile = TRUE; + bAppendToFile = true; nRecordOffset = psSHP->nFileSize; } else @@ -1930,76 +1707,90 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) nRecordOffset = psSHP->panRecOffset[nShapeId]; } -/* -------------------------------------------------------------------- */ -/* Set the shape type, record number, and record size. */ -/* -------------------------------------------------------------------- */ - i32 = (nShapeId < 0) ? psSHP->nRecords+1 : nShapeId+1; /* record # */ - if( !bBigEndian ) SwapWord( 4, &i32 ); - ByteCopy( &i32, pabyRec, 4 ); + /* -------------------------------------------------------------------- */ + /* Set the shape type, record number, and record size. */ + /* -------------------------------------------------------------------- */ + uint32_t i32 = + (nShapeId < 0) ? psSHP->nRecords + 1 : nShapeId + 1; /* record # */ +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&i32); +#endif + ByteCopy(&i32, pabyRec, 4); + + i32 = (nRecordSize - 8) / 2; /* record size */ +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&i32); +#endif + ByteCopy(&i32, pabyRec + 4, 4); - i32 = (nRecordSize-8)/2; /* record size */ - if( !bBigEndian ) SwapWord( 4, &i32 ); - ByteCopy( &i32, pabyRec + 4, 4 ); + i32 = psObject->nSHPType; /* shape type */ +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&i32); +#endif + ByteCopy(&i32, pabyRec + 8, 4); - i32 = psObject->nSHPType; /* shape type */ - if( bBigEndian ) SwapWord( 4, &i32 ); - ByteCopy( &i32, pabyRec + 8, 4 ); + /* -------------------------------------------------------------------- */ + /* Write out record. */ + /* -------------------------------------------------------------------- */ -/* -------------------------------------------------------------------- */ -/* Write out record. */ -/* -------------------------------------------------------------------- */ - if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 ) + /* -------------------------------------------------------------------- */ + /* Guard FSeek with check for whether we're already at position; */ + /* no-op FSeeks defeat network filesystems' write buffering. */ + /* -------------------------------------------------------------------- */ + if (psSHP->sHooks.FTell(psSHP->fpSHP) != nRecordOffset) { - char szErrorMsg[200]; + if (psSHP->sHooks.FSeek(psSHP->fpSHP, nRecordOffset, 0) != 0) + { + char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Error in psSHP->sHooks.FSeek() while writing object to .shp file: %s", - strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Error in psSHP->sHooks.FSeek() while writing object to " + ".shp file: %s", + strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); - free( pabyRec ); - return -1; + free(pabyRec); + return -1; + } } - if( psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) + if (psSHP->sHooks.FWrite(pabyRec, nRecordSize, 1, psSHP->fpSHP) < 1) { char szErrorMsg[200]; - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Error in psSHP->sHooks.FWrite() while writing object of %u bytes to .shp file: %s", - nRecordSize, strerror(errno) ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Error in psSHP->sHooks.FWrite() while writing object of %u " + "bytes to .shp file: %s", + nRecordSize, strerror(errno)); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); - free( pabyRec ); + free(pabyRec); return -1; } - free( pabyRec ); + free(pabyRec); - if( bAppendToLastRecord ) + if (bAppendToLastRecord) { - psSHP->nFileSize = psSHP->panRecOffset[nShapeId] + nRecordSize; + psSHP->nFileSize = psSHP->panRecOffset[nShapeId] + nRecordSize; } - else if( bAppendToFile ) + else if (bAppendToFile) { - if( nShapeId == -1 ) + if (nShapeId == -1) nShapeId = psSHP->nRecords++; psSHP->panRecOffset[nShapeId] = psSHP->nFileSize; psSHP->nFileSize += nRecordSize; } - psSHP->panRecSize[nShapeId] = nRecordSize-8; + psSHP->panRecSize[nShapeId] = nRecordSize - 8; -/* -------------------------------------------------------------------- */ -/* Expand file wide bounds based on this shape. */ -/* -------------------------------------------------------------------- */ - if( psSHP->adBoundsMin[0] == 0.0 - && psSHP->adBoundsMax[0] == 0.0 - && psSHP->adBoundsMin[1] == 0.0 - && psSHP->adBoundsMax[1] == 0.0 ) + /* -------------------------------------------------------------------- */ + /* Expand file wide bounds based on this shape. */ + /* -------------------------------------------------------------------- */ + if (bFirstFeature) { - if( psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0 ) + if (psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0) { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = 0.0; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = 0.0; @@ -2010,45 +1801,49 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; - psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ ? psObject->padfZ[0] : 0.0; - psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM ? psObject->padfM[0] : 0.0; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = + psObject->padfZ ? psObject->padfZ[0] : 0.0; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = + psObject->padfM ? psObject->padfM[0] : 0.0; } } - for( i = 0; i < psObject->nVertices; i++ ) + for (int i = 0; i < psObject->nVertices; i++) { - psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); - psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); - psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); - psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); - if( psObject->padfZ ) + psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0], psObject->padfX[i]); + psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1], psObject->padfY[i]); + psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0], psObject->padfX[i]); + psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1], psObject->padfY[i]); + if (psObject->padfZ) { - psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); - psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); + psSHP->adBoundsMin[2] = + MIN(psSHP->adBoundsMin[2], psObject->padfZ[i]); + psSHP->adBoundsMax[2] = + MAX(psSHP->adBoundsMax[2], psObject->padfZ[i]); } - if( psObject->padfM ) + if (psObject->padfM) { - psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); - psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); + psSHP->adBoundsMin[3] = + MIN(psSHP->adBoundsMin[3], psObject->padfM[i]); + psSHP->adBoundsMax[3] = + MAX(psSHP->adBoundsMax[3], psObject->padfM[i]); } } - return( nShapeId ); + return (nShapeId); } /************************************************************************/ /* SHPAllocBuffer() */ /************************************************************************/ -static void* SHPAllocBuffer(unsigned char** pBuffer, int nSize) +static void *SHPAllocBuffer(unsigned char **pBuffer, int nSize) { - unsigned char* pRet; - - if( pBuffer == SHPLIB_NULLPTR ) + if (pBuffer == SHPLIB_NULLPTR) return calloc(1, nSize); - pRet = *pBuffer; - if( pRet == SHPLIB_NULLPTR ) + unsigned char *pRet = *pBuffer; + if (pRet == SHPLIB_NULLPTR) return SHPLIB_NULLPTR; (*pBuffer) += nSize; @@ -2059,108 +1854,106 @@ static void* SHPAllocBuffer(unsigned char** pBuffer, int nSize) /* SHPReallocObjectBufIfNecessary() */ /************************************************************************/ -static unsigned char* SHPReallocObjectBufIfNecessary ( SHPHandle psSHP, - int nObjectBufSize ) +static unsigned char *SHPReallocObjectBufIfNecessary(SHPHandle psSHP, + int nObjectBufSize) { - unsigned char* pBuffer; - if( nObjectBufSize == 0 ) + if (nObjectBufSize == 0) { nObjectBufSize = 4 * sizeof(double); } - if( nObjectBufSize > psSHP->nObjectBufSize ) + + unsigned char *pBuffer; + if (nObjectBufSize > psSHP->nObjectBufSize) { - pBuffer = STATIC_CAST(unsigned char*, realloc( psSHP->pabyObjectBuf, nObjectBufSize )); - if( pBuffer != SHPLIB_NULLPTR ) + pBuffer = STATIC_CAST(unsigned char *, + realloc(psSHP->pabyObjectBuf, nObjectBufSize)); + if (pBuffer != SHPLIB_NULLPTR) { psSHP->pabyObjectBuf = pBuffer; psSHP->nObjectBufSize = nObjectBufSize; } } else + { pBuffer = psSHP->pabyObjectBuf; + } + return pBuffer; } /************************************************************************/ /* SHPReadObject() */ /* */ -/* Read the vertices, parts, and other non-attribute information */ -/* for one shape. */ +/* Read the vertices, parts, and other non-attribute information */ +/* for one shape. */ /************************************************************************/ -SHPObject SHPAPI_CALL1(*) -SHPReadObject( SHPHandle psSHP, int hEntity ) - +SHPObject SHPAPI_CALL1(*) SHPReadObject(const SHPHandle psSHP, int hEntity) { - int nEntitySize, nRequiredSize; - SHPObject *psShape; - char szErrorMsg[128]; - int nSHPType; - int nBytesRead; - -/* -------------------------------------------------------------------- */ -/* Validate the record/entity number. */ -/* -------------------------------------------------------------------- */ - if( hEntity < 0 || hEntity >= psSHP->nRecords ) + /* -------------------------------------------------------------------- */ + /* Validate the record/entity number. */ + /* -------------------------------------------------------------------- */ + if (hEntity < 0 || hEntity >= psSHP->nRecords) return SHPLIB_NULLPTR; -/* -------------------------------------------------------------------- */ -/* Read offset/length from SHX loading if necessary. */ -/* -------------------------------------------------------------------- */ - if( psSHP->panRecOffset[hEntity] == 0 && psSHP->fpSHX != SHPLIB_NULLPTR ) + /* -------------------------------------------------------------------- */ + /* Read offset/length from SHX loading if necessary. */ + /* -------------------------------------------------------------------- */ + if (psSHP->panRecOffset[hEntity] == 0 && psSHP->fpSHX != SHPLIB_NULLPTR) { - unsigned int nOffset, nLength; + unsigned int nOffset; + unsigned int nLength; - if( psSHP->sHooks.FSeek( psSHP->fpSHX, 100 + 8 * hEntity, 0 ) != 0 || - psSHP->sHooks.FRead( &nOffset, 1, 4, psSHP->fpSHX ) != 4 || - psSHP->sHooks.FRead( &nLength, 1, 4, psSHP->fpSHX ) != 4 ) + if (psSHP->sHooks.FSeek(psSHP->fpSHX, 100 + 8 * hEntity, 0) != 0 || + psSHP->sHooks.FRead(&nOffset, 1, 4, psSHP->fpSHX) != 4 || + psSHP->sHooks.FRead(&nLength, 1, 4, psSHP->fpSHX) != 4) { char str[128]; - snprintf( str, sizeof(str), - "Error in fseek()/fread() reading object from .shx file at offset %d", - 100 + 8 * hEntity); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), + "Error in fseek()/fread() reading object from .shx file " + "at offset %d", + 100 + 8 * hEntity); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } - if( !bBigEndian ) SwapWord( 4, &nOffset ); - if( !bBigEndian ) SwapWord( 4, &nLength ); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nOffset); + SHP_SWAP32(&nLength); +#endif - if( nOffset > STATIC_CAST(unsigned int, INT_MAX) ) + if (nOffset > STATIC_CAST(unsigned int, INT_MAX)) { char str[128]; - snprintf( str, sizeof(str), - "Invalid offset for entity %d", hEntity); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), "Invalid offset for entity %d", hEntity); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } - if( nLength > STATIC_CAST(unsigned int, INT_MAX / 2 - 4) ) + if (nLength > STATIC_CAST(unsigned int, INT_MAX / 2 - 4)) { char str[128]; - snprintf( str, sizeof(str), - "Invalid length for entity %d", hEntity); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), "Invalid length for entity %d", hEntity); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } - psSHP->panRecOffset[hEntity] = nOffset*2; - psSHP->panRecSize[hEntity] = nLength*2; + psSHP->panRecOffset[hEntity] = nOffset * 2; + psSHP->panRecSize[hEntity] = nLength * 2; } -/* -------------------------------------------------------------------- */ -/* Ensure our record buffer is large enough. */ -/* -------------------------------------------------------------------- */ - nEntitySize = psSHP->panRecSize[hEntity]+8; - if( nEntitySize > psSHP->nBufSize ) + /* -------------------------------------------------------------------- */ + /* Ensure our record buffer is large enough. */ + /* -------------------------------------------------------------------- */ + const int nEntitySize = psSHP->panRecSize[hEntity] + 8; + if (nEntitySize > psSHP->nBufSize) { - uchar* pabyRecNew; int nNewBufSize = nEntitySize; - if( nNewBufSize < INT_MAX - nNewBufSize / 3 ) + if (nNewBufSize < INT_MAX - nNewBufSize / 3) nNewBufSize += nNewBufSize / 3; else nNewBufSize = INT_MAX; @@ -2168,45 +1961,51 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) /* Before allocating too much memory, check that the file is big enough */ /* and do not trust the file size in the header the first time we */ /* need to allocate more than 10 MB */ - if( nNewBufSize >= 10 * 1024 * 1024 ) + if (nNewBufSize >= 10 * 1024 * 1024) { - if( psSHP->nBufSize < 10 * 1024 * 1024 ) + if (psSHP->nBufSize < 10 * 1024 * 1024) { SAOffset nFileSize; - psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 2 ); + psSHP->sHooks.FSeek(psSHP->fpSHP, 0, 2); nFileSize = psSHP->sHooks.FTell(psSHP->fpSHP); - if( nFileSize >= UINT_MAX ) + if (nFileSize >= UINT_MAX) psSHP->nFileSize = UINT_MAX; else psSHP->nFileSize = STATIC_CAST(unsigned int, nFileSize); } - if( psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || + if (psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || /* We should normally use nEntitySize instead of*/ /* psSHP->panRecSize[hEntity] in the below test, but because of */ /* the case of non conformant .shx files detailed a bit below, */ /* let be more tolerant */ - psSHP->panRecSize[hEntity] > psSHP->nFileSize - psSHP->panRecOffset[hEntity] ) + psSHP->panRecSize[hEntity] > + psSHP->nFileSize - psSHP->panRecOffset[hEntity]) { char str[128]; - snprintf( str, sizeof(str), - "Error in fread() reading object of size %d at offset %u from .shp file", - nEntitySize, psSHP->panRecOffset[hEntity] ); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), + "Error in fread() reading object of size %d at offset " + "%u from .shp file", + nEntitySize, psSHP->panRecOffset[hEntity]); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } } - pabyRecNew = STATIC_CAST(uchar *, SfRealloc(psSHP->pabyRec,nNewBufSize)); + unsigned char *pabyRecNew = + STATIC_CAST(unsigned char *, realloc(psSHP->pabyRec, nNewBufSize)); if (pabyRecNew == SHPLIB_NULLPTR) { - snprintf( szErrorMsg, sizeof(szErrorMsg), - "Not enough memory to allocate requested memory (nNewBufSize=%d). " - "Probably broken SHP file", nNewBufSize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + char szErrorMsg[160]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory " + "(nNewBufSize=%d). " + "Probably broken SHP file", + nNewBufSize); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); return SHPLIB_NULLPTR; } @@ -2221,26 +2020,27 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) return SHPLIB_NULLPTR; } -/* -------------------------------------------------------------------- */ -/* Read the record. */ -/* -------------------------------------------------------------------- */ - if( psSHP->sHooks.FSeek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ) != 0 ) + /* -------------------------------------------------------------------- */ + /* Read the record. */ + /* -------------------------------------------------------------------- */ + if (psSHP->sHooks.FSeek(psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0) != 0) { /* * TODO - mloskot: Consider detailed diagnostics of shape file, * for example to detect if file is truncated. */ char str[128]; - snprintf( str, sizeof(str), + snprintf(str, sizeof(str), "Error in fseek() reading object from .shp file at offset %u", psSHP->panRecOffset[hEntity]); - str[sizeof(str)-1] = '\0'; + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } - nBytesRead = STATIC_CAST(int, psSHP->sHooks.FRead( psSHP->pabyRec, 1, nEntitySize, psSHP->fpSHP )); + const int nBytesRead = STATIC_CAST( + int, psSHP->sHooks.FRead(psSHP->pabyRec, 1, nEntitySize, psSHP->fpSHP)); /* Special case for a shapefile whose .shx content length field is not equal */ /* to the content length field of the .shp, which is a violation of "The */ @@ -2248,64 +2048,72 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) /* file record header." (http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf, page 24) */ /* Actually in that case the .shx content length is equal to the .shp content length + */ /* 4 (16 bit words), representing the 8 bytes of the record header... */ - if( nBytesRead >= 8 && nBytesRead == nEntitySize - 8 ) + if (nBytesRead >= 8 && nBytesRead == nEntitySize - 8) { /* Do a sanity check */ int nSHPContentLength; - memcpy( &nSHPContentLength, psSHP->pabyRec + 4, 4 ); - if( !bBigEndian ) SwapWord( 4, &(nSHPContentLength) ); - if( nSHPContentLength < 0 || - nSHPContentLength > INT_MAX / 2 - 4 || - 2 * nSHPContentLength + 8 != nBytesRead ) + memcpy(&nSHPContentLength, psSHP->pabyRec + 4, 4); +#if !defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&(nSHPContentLength)); +#endif + if (nSHPContentLength < 0 || nSHPContentLength > INT_MAX / 2 - 4 || + 2 * nSHPContentLength + 8 != nBytesRead) { char str[128]; - snprintf( str, sizeof(str), - "Sanity check failed when trying to recover from inconsistent .shx/.shp with shape %d", - hEntity ); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), + "Sanity check failed when trying to recover from " + "inconsistent .shx/.shp with shape %d", + hEntity); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } } - else if( nBytesRead != nEntitySize ) + else if (nBytesRead != nEntitySize) { /* * TODO - mloskot: Consider detailed diagnostics of shape file, * for example to detect if file is truncated. */ char str[128]; - snprintf( str, sizeof(str), - "Error in fread() reading object of size %d at offset %u from .shp file", - nEntitySize, psSHP->panRecOffset[hEntity] ); - str[sizeof(str)-1] = '\0'; + snprintf(str, sizeof(str), + "Error in fread() reading object of size %d at offset %u from " + ".shp file", + nEntitySize, psSHP->panRecOffset[hEntity]); + str[sizeof(str) - 1] = '\0'; - psSHP->sHooks.Error( str ); + psSHP->sHooks.Error(str); return SHPLIB_NULLPTR; } - if ( 8 + 4 > nEntitySize ) + if (8 + 4 > nEntitySize) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Corrupted .shp file : shape %d : nEntitySize = %d", - hEntity, nEntitySize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, + nEntitySize); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); return SHPLIB_NULLPTR; } - memcpy( &nSHPType, psSHP->pabyRec + 8, 4 ); + int nSHPType; + memcpy(&nSHPType, psSHP->pabyRec + 8, 4); - if( bBigEndian ) SwapWord( 4, &(nSHPType) ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&(nSHPType)); +#endif -/* -------------------------------------------------------------------- */ -/* Allocate and minimally initialize the object. */ -/* -------------------------------------------------------------------- */ - if( psSHP->bFastModeReadObject ) + /* -------------------------------------------------------------------- */ + /* Allocate and minimally initialize the object. */ + /* -------------------------------------------------------------------- */ + SHPObject *psShape; + if (psSHP->bFastModeReadObject) { - if( psSHP->psCachedObject->bFastModeReadObject ) + if (psSHP->psCachedObject->bFastModeReadObject) { - psSHP->sHooks.Error( "Invalid read pattern in fast read mode. " - "SHPDestroyObject() should be called." ); + psSHP->sHooks.Error("Invalid read pattern in fast read mode. " + "SHPDestroyObject() should be called."); return SHPLIB_NULLPTR; } @@ -2313,69 +2121,72 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) memset(psShape, 0, sizeof(SHPObject)); } else - psShape = STATIC_CAST(SHPObject *, calloc(1,sizeof(SHPObject))); + { + psShape = STATIC_CAST(SHPObject *, calloc(1, sizeof(SHPObject))); + } psShape->nShapeId = hEntity; psShape->nSHPType = nSHPType; psShape->bMeasureIsUsed = FALSE; psShape->bFastModeReadObject = psSHP->bFastModeReadObject; -/* ==================================================================== */ -/* Extract vertices for a Polygon or Arc. */ -/* ==================================================================== */ - if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC - || psShape->nSHPType == SHPT_POLYGONZ - || psShape->nSHPType == SHPT_POLYGONM - || psShape->nSHPType == SHPT_ARCZ - || psShape->nSHPType == SHPT_ARCM - || psShape->nSHPType == SHPT_MULTIPATCH ) + /* ==================================================================== */ + /* Extract vertices for a Polygon or Arc. */ + /* ==================================================================== */ + if (psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC || + psShape->nSHPType == SHPT_POLYGONZ || + psShape->nSHPType == SHPT_POLYGONM || psShape->nSHPType == SHPT_ARCZ || + psShape->nSHPType == SHPT_ARCM || psShape->nSHPType == SHPT_MULTIPATCH) { - int32 nPoints, nParts; - int i, nOffset; - unsigned char* pBuffer = SHPLIB_NULLPTR; - unsigned char** ppBuffer = SHPLIB_NULLPTR; - - if ( 40 + 8 + 4 > nEntitySize ) + if (40 + 8 + 4 > nEntitySize) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } -/* -------------------------------------------------------------------- */ -/* Get the X/Y bounds. */ -/* -------------------------------------------------------------------- */ - memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); - memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); - memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); - memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); - - if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); - -/* -------------------------------------------------------------------- */ -/* Extract part/point count, and build vertex and part arrays */ -/* to proper size. */ -/* -------------------------------------------------------------------- */ - memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); - memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); - - if( bBigEndian ) SwapWord( 4, &nPoints ); - if( bBigEndian ) SwapWord( 4, &nParts ); + /* -------------------------------------------------------------------- */ + /* Get the X/Y bounds. */ + /* -------------------------------------------------------------------- */ +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(&psShape->dfXMin, psSHP->pabyRec + 8 + 4); + SHP_SWAPDOUBLE_CPY(&psShape->dfYMin, psSHP->pabyRec + 8 + 12); + SHP_SWAPDOUBLE_CPY(&psShape->dfXMax, psSHP->pabyRec + 8 + 20); + SHP_SWAPDOUBLE_CPY(&psShape->dfYMax, psSHP->pabyRec + 8 + 28); +#else + memcpy(&psShape->dfXMin, psSHP->pabyRec + 8 + 4, 8); + memcpy(&psShape->dfYMin, psSHP->pabyRec + 8 + 12, 8); + memcpy(&psShape->dfXMax, psSHP->pabyRec + 8 + 20, 8); + memcpy(&psShape->dfYMax, psSHP->pabyRec + 8 + 28, 8); +#endif + + /* -------------------------------------------------------------------- */ + /* Extract part/point count, and build vertex and part arrays */ + /* to proper size. */ + /* -------------------------------------------------------------------- */ + uint32_t nPoints; + memcpy(&nPoints, psSHP->pabyRec + 40 + 8, 4); + uint32_t nParts; + memcpy(&nParts, psSHP->pabyRec + 36 + 8, 4); + +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nPoints); + SHP_SWAP32(&nParts); +#endif /* nPoints and nParts are unsigned */ if (/* nPoints < 0 || nParts < 0 || */ nPoints > 50 * 1000 * 1000 || nParts > 10 * 1000 * 1000) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u.", hEntity, nPoints, nParts); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } @@ -2383,44 +2194,56 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) /* With the previous checks on nPoints and nParts, */ /* we should not overflow here and after */ /* since 50 M * (16 + 8 + 8) = 1 600 MB */ - nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; - if ( psShape->nSHPType == SHPT_POLYGONZ - || psShape->nSHPType == SHPT_ARCZ - || psShape->nSHPType == SHPT_MULTIPATCH ) + int nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; + if (psShape->nSHPType == SHPT_POLYGONZ || + psShape->nSHPType == SHPT_ARCZ || + psShape->nSHPType == SHPT_MULTIPATCH) { nRequiredSize += 16 + 8 * nPoints; } - if( psShape->nSHPType == SHPT_MULTIPATCH ) + if (psShape->nSHPType == SHPT_MULTIPATCH) { nRequiredSize += 4 * nParts; } if (nRequiredSize > nEntitySize) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u, nEntitySize=%d.", + "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u, " + "nEntitySize=%d.", hEntity, nPoints, nParts, nEntitySize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - if( psShape->bFastModeReadObject ) + unsigned char *pBuffer = SHPLIB_NULLPTR; + unsigned char **ppBuffer = SHPLIB_NULLPTR; + + if (psShape->bFastModeReadObject) { - int nObjectBufSize = 4 * sizeof(double) * nPoints + 2 * sizeof(int) * nParts; + const int nObjectBufSize = + 4 * sizeof(double) * nPoints + 2 * sizeof(int) * nParts; pBuffer = SHPReallocObjectBufIfNecessary(psSHP, nObjectBufSize); ppBuffer = &pBuffer; } psShape->nVertices = nPoints; - psShape->padfX = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); - psShape->padfY = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); - psShape->padfZ = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); - psShape->padfM = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfX = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfY = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfZ = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfM = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); psShape->nParts = nParts; - psShape->panPartStart = STATIC_CAST(int *, SHPAllocBuffer(ppBuffer, nParts * sizeof(int))); - psShape->panPartType = STATIC_CAST(int *, SHPAllocBuffer(ppBuffer, nParts * sizeof(int))); + psShape->panPartStart = + STATIC_CAST(int *, SHPAllocBuffer(ppBuffer, nParts * sizeof(int))); + psShape->panPartType = + STATIC_CAST(int *, SHPAllocBuffer(ppBuffer, nParts * sizeof(int))); if (psShape->padfX == SHPLIB_NULLPTR || psShape->padfY == SHPLIB_NULLPTR || @@ -2429,308 +2252,363 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) psShape->panPartStart == SHPLIB_NULLPTR || psShape->panPartType == SHPLIB_NULLPTR) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Not enough memory to allocate requested memory (nPoints=%u, nParts=%u) for shape %d. " - "Probably broken SHP file", nPoints, nParts, hEntity ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + "Not enough memory to allocate requested memory " + "(nPoints=%u, nParts=%u) for shape %d. " + "Probably broken SHP file", + nPoints, nParts, hEntity); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - for( i = 0; STATIC_CAST(int32, i) < nParts; i++ ) + for (int i = 0; STATIC_CAST(uint32_t, i) < nParts; i++) psShape->panPartType[i] = SHPP_RING; -/* -------------------------------------------------------------------- */ -/* Copy out the part array from the record. */ -/* -------------------------------------------------------------------- */ - memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); - for( i = 0; STATIC_CAST(int32, i) < nParts; i++ ) + /* -------------------------------------------------------------------- */ + /* Copy out the part array from the record. */ + /* -------------------------------------------------------------------- */ + memcpy(psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts); + for (int i = 0; STATIC_CAST(uint32_t, i) < nParts; i++) { - if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(psShape->panPartStart + i); +#endif /* We check that the offset is inside the vertex array */ - if (psShape->panPartStart[i] < 0 - || (psShape->panPartStart[i] >= psShape->nVertices - && psShape->nVertices > 0) - || (psShape->panPartStart[i] > 0 && psShape->nVertices == 0) ) + if (psShape->panPartStart[i] < 0 || + (psShape->panPartStart[i] >= psShape->nVertices && + psShape->nVertices > 0) || + (psShape->panPartStart[i] > 0 && psShape->nVertices == 0)) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", - hEntity, i, psShape->panPartStart[i], psShape->nVertices); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + "Corrupted .shp file : shape %d : panPartStart[%d] = " + "%d, nVertices = %d", + hEntity, i, psShape->panPartStart[i], + psShape->nVertices); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - if (i > 0 && psShape->panPartStart[i] <= psShape->panPartStart[i-1]) + if (i > 0 && + psShape->panPartStart[i] <= psShape->panPartStart[i - 1]) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", - hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + "Corrupted .shp file : shape %d : panPartStart[%d] = " + "%d, panPartStart[%d] = %d", + hEntity, i, psShape->panPartStart[i], i - 1, + psShape->panPartStart[i - 1]); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } } - nOffset = 44 + 8 + 4*nParts; + int nOffset = 44 + 8 + 4 * nParts; -/* -------------------------------------------------------------------- */ -/* If this is a multipatch, we will also have parts types. */ -/* -------------------------------------------------------------------- */ - if( psShape->nSHPType == SHPT_MULTIPATCH ) + /* -------------------------------------------------------------------- */ + /* If this is a multipatch, we will also have parts types. */ + /* -------------------------------------------------------------------- */ + if (psShape->nSHPType == SHPT_MULTIPATCH) { - memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); - for( i = 0; STATIC_CAST(int32, i) < nParts; i++ ) + memcpy(psShape->panPartType, psSHP->pabyRec + nOffset, 4 * nParts); + for (int i = 0; STATIC_CAST(uint32_t, i) < nParts; i++) { - if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(psShape->panPartType + i); +#endif } - nOffset += 4*nParts; + nOffset += 4 * nParts; } -/* -------------------------------------------------------------------- */ -/* Copy out the vertices from the record. */ -/* -------------------------------------------------------------------- */ - for( i = 0; STATIC_CAST(int32, i) < nPoints; i++ ) + /* -------------------------------------------------------------------- */ + /* Copy out the vertices from the record. */ + /* -------------------------------------------------------------------- */ + for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++) { - memcpy(psShape->padfX + i, - psSHP->pabyRec + nOffset + i * 16, - 8 ); - - memcpy(psShape->padfY + i, - psSHP->pabyRec + nOffset + i * 16 + 8, - 8 ); - - if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); - if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfX + i, + psSHP->pabyRec + nOffset + i * 16); + SHP_SWAPDOUBLE_CPY(psShape->padfY + i, + psSHP->pabyRec + nOffset + i * 16 + 8); +#else + memcpy(psShape->padfX + i, psSHP->pabyRec + nOffset + i * 16, 8); + memcpy(psShape->padfY + i, psSHP->pabyRec + nOffset + i * 16 + 8, + 8); +#endif } - nOffset += 16*nPoints; + nOffset += 16 * nPoints; -/* -------------------------------------------------------------------- */ -/* If we have a Z coordinate, collect that now. */ -/* -------------------------------------------------------------------- */ - if( psShape->nSHPType == SHPT_POLYGONZ - || psShape->nSHPType == SHPT_ARCZ - || psShape->nSHPType == SHPT_MULTIPATCH ) + /* -------------------------------------------------------------------- */ + /* If we have a Z coordinate, collect that now. */ + /* -------------------------------------------------------------------- */ + if (psShape->nSHPType == SHPT_POLYGONZ || + psShape->nSHPType == SHPT_ARCZ || + psShape->nSHPType == SHPT_MULTIPATCH) { - memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); - memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(&psShape->dfZMin, psSHP->pabyRec + nOffset); + SHP_SWAPDOUBLE_CPY(&psShape->dfZMax, psSHP->pabyRec + nOffset + 8); +#else + memcpy(&psShape->dfZMin, psSHP->pabyRec + nOffset, 8); + memcpy(&psShape->dfZMax, psSHP->pabyRec + nOffset + 8, 8); - if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); +#endif - for( i = 0; STATIC_CAST(int32, i) < nPoints; i++ ) + for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++) { - memcpy( psShape->padfZ + i, - psSHP->pabyRec + nOffset + 16 + i*8, 8 ); - if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i * 8); +#else + memcpy(psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i * 8, 8); +#endif } - nOffset += 16 + 8*nPoints; + nOffset += 16 + 8 * nPoints; } - else if( psShape->bFastModeReadObject ) + else if (psShape->bFastModeReadObject) { psShape->padfZ = SHPLIB_NULLPTR; } -/* -------------------------------------------------------------------- */ -/* If we have a M measure value, then read it now. We assume */ -/* that the measure can be present for any shape if the size is */ -/* big enough, but really it will only occur for the Z shapes */ -/* (options), and the M shapes. */ -/* -------------------------------------------------------------------- */ - if( nEntitySize >= STATIC_CAST(int, nOffset + 16 + 8*nPoints) ) + /* -------------------------------------------------------------------- */ + /* If we have a M measure value, then read it now. We assume */ + /* that the measure can be present for any shape if the size is */ + /* big enough, but really it will only occur for the Z shapes */ + /* (options), and the M shapes. */ + /* -------------------------------------------------------------------- */ + if (nEntitySize >= STATIC_CAST(int, nOffset + 16 + 8 * nPoints)) { - memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); - memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); - - if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(&psShape->dfMMin, psSHP->pabyRec + nOffset); + SHP_SWAPDOUBLE_CPY(&psShape->dfMMax, psSHP->pabyRec + nOffset + 8); +#else + memcpy(&psShape->dfMMin, psSHP->pabyRec + nOffset, 8); + memcpy(&psShape->dfMMax, psSHP->pabyRec + nOffset + 8, 8); +#endif - for( i = 0; STATIC_CAST(int32, i) < nPoints; i++ ) + for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++) { - memcpy( psShape->padfM + i, - psSHP->pabyRec + nOffset + 16 + i*8, 8 ); - if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i * 8); +#else + memcpy(psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i * 8, 8); +#endif } psShape->bMeasureIsUsed = TRUE; } - else if( psShape->bFastModeReadObject ) + else if (psShape->bFastModeReadObject) { psShape->padfM = SHPLIB_NULLPTR; } } -/* ==================================================================== */ -/* Extract vertices for a MultiPoint. */ -/* ==================================================================== */ - else if( psShape->nSHPType == SHPT_MULTIPOINT - || psShape->nSHPType == SHPT_MULTIPOINTM - || psShape->nSHPType == SHPT_MULTIPOINTZ ) + /* ==================================================================== */ + /* Extract vertices for a MultiPoint. */ + /* ==================================================================== */ + else if (psShape->nSHPType == SHPT_MULTIPOINT || + psShape->nSHPType == SHPT_MULTIPOINTM || + psShape->nSHPType == SHPT_MULTIPOINTZ) { - int32 nPoints; - int i, nOffset; - unsigned char* pBuffer = SHPLIB_NULLPTR; - unsigned char** ppBuffer = SHPLIB_NULLPTR; - - if ( 44 + 4 > nEntitySize ) + if (44 + 4 > nEntitySize) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); + uint32_t nPoints; + memcpy(&nPoints, psSHP->pabyRec + 44, 4); - if( bBigEndian ) SwapWord( 4, &nPoints ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAP32(&nPoints); +#endif /* nPoints is unsigned */ if (/* nPoints < 0 || */ nPoints > 50 * 1000 * 1000) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Corrupted .shp file : shape %d : nPoints = %u", - hEntity, nPoints); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + "Corrupted .shp file : shape %d : nPoints = %u", hEntity, + nPoints); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - nRequiredSize = 48 + nPoints * 16; - if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + int nRequiredSize = 48 + nPoints * 16; + if (psShape->nSHPType == SHPT_MULTIPOINTZ) { nRequiredSize += 16 + nPoints * 8; } if (nRequiredSize > nEntitySize) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Corrupted .shp file : shape %d : nPoints = %u, nEntitySize = %d", + "Corrupted .shp file : shape %d : nPoints = %u, " + "nEntitySize = %d", hEntity, nPoints, nEntitySize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - if( psShape->bFastModeReadObject ) + unsigned char *pBuffer = SHPLIB_NULLPTR; + unsigned char **ppBuffer = SHPLIB_NULLPTR; + + if (psShape->bFastModeReadObject) { - int nObjectBufSize = 4 * sizeof(double) * nPoints; + const int nObjectBufSize = 4 * sizeof(double) * nPoints; pBuffer = SHPReallocObjectBufIfNecessary(psSHP, nObjectBufSize); ppBuffer = &pBuffer; } psShape->nVertices = nPoints; - psShape->padfX = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); - psShape->padfY = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); - psShape->padfZ = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); - psShape->padfM = STATIC_CAST(double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfX = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfY = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfZ = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); + psShape->padfM = STATIC_CAST( + double *, SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints)); if (psShape->padfX == SHPLIB_NULLPTR || psShape->padfY == SHPLIB_NULLPTR || psShape->padfZ == SHPLIB_NULLPTR || psShape->padfM == SHPLIB_NULLPTR) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), - "Not enough memory to allocate requested memory (nPoints=%u) for shape %d. " - "Probably broken SHP file", nPoints, hEntity ); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + "Not enough memory to allocate requested memory " + "(nPoints=%u) for shape %d. " + "Probably broken SHP file", + nPoints, hEntity); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - for( i = 0; STATIC_CAST(int32, i) < nPoints; i++ ) + for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++) { - memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); - memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); - - if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); - if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfX + i, + psSHP->pabyRec + 48 + 16 * i); + SHP_SWAPDOUBLE_CPY(psShape->padfY + i, + psSHP->pabyRec + 48 + 16 * i + 8); +#else + memcpy(psShape->padfX + i, psSHP->pabyRec + 48 + 16 * i, 8); + memcpy(psShape->padfY + i, psSHP->pabyRec + 48 + 16 * i + 8, 8); +#endif } - nOffset = 48 + 16*nPoints; - -/* -------------------------------------------------------------------- */ -/* Get the X/Y bounds. */ -/* -------------------------------------------------------------------- */ - memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); - memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); - memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); - memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + int nOffset = 48 + 16 * nPoints; - if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + /* -------------------------------------------------------------------- */ + /* Get the X/Y bounds. */ + /* -------------------------------------------------------------------- */ +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(&psShape->dfXMin, psSHP->pabyRec + 8 + 4); + SHP_SWAPDOUBLE_CPY(&psShape->dfYMin, psSHP->pabyRec + 8 + 12); + SHP_SWAPDOUBLE_CPY(&psShape->dfXMax, psSHP->pabyRec + 8 + 20); + SHP_SWAPDOUBLE_CPY(&psShape->dfYMax, psSHP->pabyRec + 8 + 28); +#else + memcpy(&psShape->dfXMin, psSHP->pabyRec + 8 + 4, 8); + memcpy(&psShape->dfYMin, psSHP->pabyRec + 8 + 12, 8); + memcpy(&psShape->dfXMax, psSHP->pabyRec + 8 + 20, 8); + memcpy(&psShape->dfYMax, psSHP->pabyRec + 8 + 28, 8); +#endif -/* -------------------------------------------------------------------- */ -/* If we have a Z coordinate, collect that now. */ -/* -------------------------------------------------------------------- */ - if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + /* -------------------------------------------------------------------- */ + /* If we have a Z coordinate, collect that now. */ + /* -------------------------------------------------------------------- */ + if (psShape->nSHPType == SHPT_MULTIPOINTZ) { - memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); - memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); - - if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(&psShape->dfZMin, psSHP->pabyRec + nOffset); + SHP_SWAPDOUBLE_CPY(&psShape->dfZMax, psSHP->pabyRec + nOffset + 8); +#else + memcpy(&psShape->dfZMin, psSHP->pabyRec + nOffset, 8); + memcpy(&psShape->dfZMax, psSHP->pabyRec + nOffset + 8, 8); +#endif - for( i = 0; STATIC_CAST(int32, i) < nPoints; i++ ) + for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++) { - memcpy( psShape->padfZ + i, - psSHP->pabyRec + nOffset + 16 + i*8, 8 ); - if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i * 8); +#else + memcpy(psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i * 8, 8); +#endif } - nOffset += 16 + 8*nPoints; + nOffset += 16 + 8 * nPoints; } - else if( psShape->bFastModeReadObject ) + else if (psShape->bFastModeReadObject) psShape->padfZ = SHPLIB_NULLPTR; -/* -------------------------------------------------------------------- */ -/* If we have a M measure value, then read it now. We assume */ -/* that the measure can be present for any shape if the size is */ -/* big enough, but really it will only occur for the Z shapes */ -/* (options), and the M shapes. */ -/* -------------------------------------------------------------------- */ - if( nEntitySize >= STATIC_CAST(int, nOffset + 16 + 8*nPoints) ) - { - memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); - memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); - - if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); - if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + /* -------------------------------------------------------------------- */ + /* If we have a M measure value, then read it now. We assume */ + /* that the measure can be present for any shape if the size is */ + /* big enough, but really it will only occur for the Z shapes */ + /* (options), and the M shapes. */ + /* -------------------------------------------------------------------- */ + if (nEntitySize >= STATIC_CAST(int, nOffset + 16 + 8 * nPoints)) + { +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(&psShape->dfMMin, psSHP->pabyRec + nOffset); + SHP_SWAPDOUBLE_CPY(&psShape->dfMMax, psSHP->pabyRec + nOffset + 8); +#else + memcpy(&psShape->dfMMin, psSHP->pabyRec + nOffset, 8); + memcpy(&psShape->dfMMax, psSHP->pabyRec + nOffset + 8, 8); +#endif - for( i = 0; STATIC_CAST(int32, i) < nPoints; i++ ) + for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++) { - memcpy( psShape->padfM + i, - psSHP->pabyRec + nOffset + 16 + i*8, 8 ); - if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i * 8); +#else + memcpy(psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i * 8, 8); +#endif } psShape->bMeasureIsUsed = TRUE; } - else if( psShape->bFastModeReadObject ) + else if (psShape->bFastModeReadObject) psShape->padfM = SHPLIB_NULLPTR; } -/* ==================================================================== */ -/* Extract vertices for a point. */ -/* ==================================================================== */ - else if( psShape->nSHPType == SHPT_POINT - || psShape->nSHPType == SHPT_POINTM - || psShape->nSHPType == SHPT_POINTZ ) + /* ==================================================================== */ + /* Extract vertices for a point. */ + /* ==================================================================== */ + else if (psShape->nSHPType == SHPT_POINT || + psShape->nSHPType == SHPT_POINTM || + psShape->nSHPType == SHPT_POINTZ) { - int nOffset; - psShape->nVertices = 1; - if( psShape->bFastModeReadObject ) + if (psShape->bFastModeReadObject) { psShape->padfX = &(psShape->dfXMin); psShape->padfY = &(psShape->dfYMin); @@ -2741,123 +2619,128 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) } else { - psShape->padfX = STATIC_CAST(double *, calloc(1,sizeof(double))); - psShape->padfY = STATIC_CAST(double *, calloc(1,sizeof(double))); - psShape->padfZ = STATIC_CAST(double *, calloc(1,sizeof(double))); - psShape->padfM = STATIC_CAST(double *, calloc(1,sizeof(double))); + psShape->padfX = STATIC_CAST(double *, calloc(1, sizeof(double))); + psShape->padfY = STATIC_CAST(double *, calloc(1, sizeof(double))); + psShape->padfZ = STATIC_CAST(double *, calloc(1, sizeof(double))); + psShape->padfM = STATIC_CAST(double *, calloc(1, sizeof(double))); } - if (20 + 8 + (( psShape->nSHPType == SHPT_POINTZ ) ? 8 : 0)> nEntitySize) + if (20 + 8 + ((psShape->nSHPType == SHPT_POINTZ) ? 8 : 0) > nEntitySize) { + char szErrorMsg[160]; snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); - szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; - psSHP->sHooks.Error( szErrorMsg ); + szErrorMsg[sizeof(szErrorMsg) - 1] = '\0'; + psSHP->sHooks.Error(szErrorMsg); SHPDestroyObject(psShape); return SHPLIB_NULLPTR; } - memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); - memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); - - if( bBigEndian ) SwapWord( 8, psShape->padfX ); - if( bBigEndian ) SwapWord( 8, psShape->padfY ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfX, psSHP->pabyRec + 12); + SHP_SWAPDOUBLE_CPY(psShape->padfY, psSHP->pabyRec + 20); +#else + memcpy(psShape->padfX, psSHP->pabyRec + 12, 8); + memcpy(psShape->padfY, psSHP->pabyRec + 20, 8); +#endif - nOffset = 20 + 8; + int nOffset = 20 + 8; -/* -------------------------------------------------------------------- */ -/* If we have a Z coordinate, collect that now. */ -/* -------------------------------------------------------------------- */ - if( psShape->nSHPType == SHPT_POINTZ ) + /* -------------------------------------------------------------------- */ + /* If we have a Z coordinate, collect that now. */ + /* -------------------------------------------------------------------- */ + if (psShape->nSHPType == SHPT_POINTZ) { - memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); - - if( bBigEndian ) SwapWord( 8, psShape->padfZ ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfZ, psSHP->pabyRec + nOffset); +#else + memcpy(psShape->padfZ, psSHP->pabyRec + nOffset, 8); +#endif nOffset += 8; } -/* -------------------------------------------------------------------- */ -/* If we have a M measure value, then read it now. We assume */ -/* that the measure can be present for any shape if the size is */ -/* big enough, but really it will only occur for the Z shapes */ -/* (options), and the M shapes. */ -/* -------------------------------------------------------------------- */ - if( nEntitySize >= nOffset + 8 ) + /* -------------------------------------------------------------------- */ + /* If we have a M measure value, then read it now. We assume */ + /* that the measure can be present for any shape if the size is */ + /* big enough, but really it will only occur for the Z shapes */ + /* (options), and the M shapes. */ + /* -------------------------------------------------------------------- */ + if (nEntitySize >= nOffset + 8) { - memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); - - if( bBigEndian ) SwapWord( 8, psShape->padfM ); +#if defined(SHP_BIG_ENDIAN) + SHP_SWAPDOUBLE_CPY(psShape->padfM, psSHP->pabyRec + nOffset); +#else + memcpy(psShape->padfM, psSHP->pabyRec + nOffset, 8); +#endif psShape->bMeasureIsUsed = TRUE; } -/* -------------------------------------------------------------------- */ -/* Since no extents are supplied in the record, we will apply */ -/* them from the single vertex. */ -/* -------------------------------------------------------------------- */ + /* -------------------------------------------------------------------- */ + /* Since no extents are supplied in the record, we will apply */ + /* them from the single vertex. */ + /* -------------------------------------------------------------------- */ psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; } - return( psShape ); + return (psShape); } /************************************************************************/ /* SHPTypeName() */ /************************************************************************/ -const char SHPAPI_CALL1(*) -SHPTypeName( int nSHPType ) - +const char SHPAPI_CALL1(*) SHPTypeName(int nSHPType) { - switch( nSHPType ) + switch (nSHPType) { - case SHPT_NULL: - return "NullShape"; + case SHPT_NULL: + return "NullShape"; - case SHPT_POINT: - return "Point"; + case SHPT_POINT: + return "Point"; - case SHPT_ARC: - return "Arc"; + case SHPT_ARC: + return "Arc"; - case SHPT_POLYGON: - return "Polygon"; + case SHPT_POLYGON: + return "Polygon"; - case SHPT_MULTIPOINT: - return "MultiPoint"; + case SHPT_MULTIPOINT: + return "MultiPoint"; - case SHPT_POINTZ: - return "PointZ"; + case SHPT_POINTZ: + return "PointZ"; - case SHPT_ARCZ: - return "ArcZ"; + case SHPT_ARCZ: + return "ArcZ"; - case SHPT_POLYGONZ: - return "PolygonZ"; + case SHPT_POLYGONZ: + return "PolygonZ"; - case SHPT_MULTIPOINTZ: - return "MultiPointZ"; + case SHPT_MULTIPOINTZ: + return "MultiPointZ"; - case SHPT_POINTM: - return "PointM"; + case SHPT_POINTM: + return "PointM"; - case SHPT_ARCM: - return "ArcM"; + case SHPT_ARCM: + return "ArcM"; - case SHPT_POLYGONM: - return "PolygonM"; + case SHPT_POLYGONM: + return "PolygonM"; - case SHPT_MULTIPOINTM: - return "MultiPointM"; + case SHPT_MULTIPOINTM: + return "MultiPointM"; - case SHPT_MULTIPATCH: - return "MultiPatch"; + case SHPT_MULTIPATCH: + return "MultiPatch"; - default: - return "UnknownShapeType"; + default: + return "UnknownShapeType"; } } @@ -2865,32 +2748,30 @@ SHPTypeName( int nSHPType ) /* SHPPartTypeName() */ /************************************************************************/ -const char SHPAPI_CALL1(*) -SHPPartTypeName( int nPartType ) - +const char SHPAPI_CALL1(*) SHPPartTypeName(int nPartType) { - switch( nPartType ) + switch (nPartType) { - case SHPP_TRISTRIP: - return "TriangleStrip"; + case SHPP_TRISTRIP: + return "TriangleStrip"; - case SHPP_TRIFAN: - return "TriangleFan"; + case SHPP_TRIFAN: + return "TriangleFan"; - case SHPP_OUTERRING: - return "OuterRing"; + case SHPP_OUTERRING: + return "OuterRing"; - case SHPP_INNERRING: - return "InnerRing"; + case SHPP_INNERRING: + return "InnerRing"; - case SHPP_FIRSTRING: - return "FirstRing"; + case SHPP_FIRSTRING: + return "FirstRing"; - case SHPP_RING: - return "Ring"; + case SHPP_RING: + return "Ring"; - default: - return "UnknownPartType"; + default: + return "UnknownPartType"; } } @@ -2898,118 +2779,130 @@ SHPPartTypeName( int nPartType ) /* SHPDestroyObject() */ /************************************************************************/ -void SHPAPI_CALL -SHPDestroyObject( SHPObject * psShape ) - +void SHPAPI_CALL SHPDestroyObject(SHPObject *psShape) { - if( psShape == SHPLIB_NULLPTR ) + if (psShape == SHPLIB_NULLPTR) return; - if( psShape->bFastModeReadObject ) + if (psShape->bFastModeReadObject) { psShape->bFastModeReadObject = FALSE; return; } - if( psShape->padfX != SHPLIB_NULLPTR ) - free( psShape->padfX ); - if( psShape->padfY != SHPLIB_NULLPTR ) - free( psShape->padfY ); - if( psShape->padfZ != SHPLIB_NULLPTR ) - free( psShape->padfZ ); - if( psShape->padfM != SHPLIB_NULLPTR ) - free( psShape->padfM ); + if (psShape->padfX != SHPLIB_NULLPTR) + free(psShape->padfX); + if (psShape->padfY != SHPLIB_NULLPTR) + free(psShape->padfY); + if (psShape->padfZ != SHPLIB_NULLPTR) + free(psShape->padfZ); + if (psShape->padfM != SHPLIB_NULLPTR) + free(psShape->padfM); - if( psShape->panPartStart != SHPLIB_NULLPTR ) - free( psShape->panPartStart ); - if( psShape->panPartType != SHPLIB_NULLPTR ) - free( psShape->panPartType ); + if (psShape->panPartStart != SHPLIB_NULLPTR) + free(psShape->panPartStart); + if (psShape->panPartType != SHPLIB_NULLPTR) + free(psShape->panPartType); - free( psShape ); + free(psShape); } /************************************************************************/ /* SHPGetPartVertexCount() */ /************************************************************************/ -static int SHPGetPartVertexCount( const SHPObject * psObject, int iPart ) +static int SHPGetPartVertexCount(const SHPObject *psObject, int iPart) { - if( iPart == psObject->nParts-1 ) + if (iPart == psObject->nParts - 1) return psObject->nVertices - psObject->panPartStart[iPart]; else - return psObject->panPartStart[iPart+1] - psObject->panPartStart[iPart]; + return psObject->panPartStart[iPart + 1] - + psObject->panPartStart[iPart]; } /************************************************************************/ /* SHPRewindIsInnerRing() */ /************************************************************************/ -static int SHPRewindIsInnerRing( const SHPObject * psObject, - int iOpRing ) +/* Return -1 in case of ambiguity */ +static int SHPRewindIsInnerRing(const SHPObject *psObject, int iOpRing, + double dfTestX, double dfTestY, + double dfRelativeTolerance, int bSameZ, + double dfTestZ) { -/* -------------------------------------------------------------------- */ -/* Determine if this ring is an inner ring or an outer ring */ -/* relative to all the other rings. For now we assume the */ -/* first ring is outer and all others are inner, but eventually */ -/* we need to fix this to handle multiple island polygons and */ -/* unordered sets of rings. */ -/* */ -/* -------------------------------------------------------------------- */ - - /* Use point in the middle of segment to avoid testing - * common points of rings. - */ - const int iOpRingStart = psObject->panPartStart[iOpRing]; - double dfTestX = ( psObject->padfX[iOpRingStart] + - psObject->padfX[iOpRingStart + 1] ) / 2; - double dfTestY = ( psObject->padfY[iOpRingStart] + - psObject->padfY[iOpRingStart + 1] ) / 2; - - int bInner = FALSE; - int iCheckRing; - for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) - { - int nVertStartCheck, nVertCountCheck; - int iEdge; - - if( iCheckRing == iOpRing ) + /* -------------------------------------------------------------------- */ + /* Determine if this ring is an inner ring or an outer ring */ + /* relative to all the other rings. For now we assume the */ + /* first ring is outer and all others are inner, but eventually */ + /* we need to fix this to handle multiple island polygons and */ + /* unordered sets of rings. */ + /* */ + /* -------------------------------------------------------------------- */ + + bool bInner = false; + for (int iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++) + { + if (iCheckRing == iOpRing) continue; - nVertStartCheck = psObject->panPartStart[iCheckRing]; - nVertCountCheck = SHPGetPartVertexCount(psObject, iCheckRing); + const int nVertStartCheck = psObject->panPartStart[iCheckRing]; + const int nVertCountCheck = SHPGetPartVertexCount(psObject, iCheckRing); - for( iEdge = 0; iEdge < nVertCountCheck; iEdge++ ) + /* Ignore rings that don't have the same (constant) Z value as the + * point. */ + /* As noted in SHPRewindObject(), this is a simplification */ + /* of what we should ideally do. */ + if (!bSameZ) { - int iNext; + int bZTestOK = TRUE; + for (int iVert = nVertStartCheck + 1; + iVert < nVertStartCheck + nVertCountCheck; ++iVert) + { + if (psObject->padfZ[iVert] != dfTestZ) + { + bZTestOK = FALSE; + break; + } + } + if (!bZTestOK) + continue; + } - if( iEdge < nVertCountCheck-1 ) - iNext = iEdge+1; + for (int iEdge = 0; iEdge < nVertCountCheck; iEdge++) + { + int iNext; + if (iEdge < nVertCountCheck - 1) + iNext = iEdge + 1; else iNext = 0; + const double y0 = psObject->padfY[iEdge + nVertStartCheck]; + const double y1 = psObject->padfY[iNext + nVertStartCheck]; /* Rule #1: * Test whether the edge 'straddles' the horizontal ray from * the test point (dfTestY,dfTestY) * The rule #1 also excludes edges colinear with the ray. */ - if ( ( psObject->padfY[iEdge+nVertStartCheck] < dfTestY - && dfTestY <= psObject->padfY[iNext+nVertStartCheck] ) - || ( psObject->padfY[iNext+nVertStartCheck] < dfTestY - && dfTestY <= psObject->padfY[iEdge+nVertStartCheck] ) ) + if ((y0 < dfTestY && dfTestY <= y1) || + (y1 < dfTestY && dfTestY <= y0)) { /* Rule #2: * Test if edge-ray intersection is on the right from the * test point (dfTestY,dfTestY) */ - double const intersect = - ( psObject->padfX[iEdge+nVertStartCheck] - + ( dfTestY - psObject->padfY[iEdge+nVertStartCheck] ) - / ( psObject->padfY[iNext+nVertStartCheck] - - psObject->padfY[iEdge+nVertStartCheck] ) - * ( psObject->padfX[iNext+nVertStartCheck] - - psObject->padfX[iEdge+nVertStartCheck] ) ); - - if (intersect < dfTestX) + const double x0 = psObject->padfX[iEdge + nVertStartCheck]; + const double x1 = psObject->padfX[iNext + nVertStartCheck]; + const double intersect_minus_testX = + (x0 - dfTestX) + (dfTestY - y0) / (y1 - y0) * (x1 - x0); + + if (fabs(intersect_minus_testX) <= + dfRelativeTolerance * fabs(dfTestX)) + { + /* Potential shared edge, or slightly overlapping polygons + */ + return -1; + } + else if (intersect_minus_testX < 0) { bInner = !bInner; } @@ -3026,96 +2919,170 @@ static int SHPRewindIsInnerRing( const SHPObject * psObject, /* specification. */ /************************************************************************/ -int SHPAPI_CALL -SHPRewindObject( CPL_UNUSED SHPHandle hSHP, - SHPObject * psObject ) +int SHPAPI_CALL SHPRewindObject(const SHPHandle hSHP, SHPObject *psObject) { - int iOpRing, bAltered = 0; - -/* -------------------------------------------------------------------- */ -/* Do nothing if this is not a polygon object. */ -/* -------------------------------------------------------------------- */ - if( psObject->nSHPType != SHPT_POLYGON - && psObject->nSHPType != SHPT_POLYGONZ - && psObject->nSHPType != SHPT_POLYGONM ) + (void)hSHP; + /* -------------------------------------------------------------------- */ + /* Do nothing if this is not a polygon object. */ + /* -------------------------------------------------------------------- */ + if (psObject->nSHPType != SHPT_POLYGON && + psObject->nSHPType != SHPT_POLYGONZ && + psObject->nSHPType != SHPT_POLYGONM) return 0; - if( psObject->nVertices == 0 || psObject->nParts == 0 ) + if (psObject->nVertices == 0 || psObject->nParts == 0) return 0; -/* -------------------------------------------------------------------- */ -/* Process each of the rings. */ -/* -------------------------------------------------------------------- */ - for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) + /* -------------------------------------------------------------------- */ + /* Test if all points have the same Z value. */ + /* -------------------------------------------------------------------- */ + int bSameZ = TRUE; + if (psObject->nSHPType == SHPT_POLYGONZ || + psObject->nSHPType == SHPT_POLYGONM) { - int bInner, iVert, nVertCount, nVertStart; - double dfSum; + for (int iVert = 1; iVert < psObject->nVertices; ++iVert) + { + if (psObject->padfZ[iVert] != psObject->padfZ[0]) + { + bSameZ = FALSE; + break; + } + } + } - nVertStart = psObject->panPartStart[iOpRing]; - nVertCount = SHPGetPartVertexCount(psObject, iOpRing); + /* -------------------------------------------------------------------- */ + /* Process each of the rings. */ + /* -------------------------------------------------------------------- */ + int bAltered = 0; + for (int iOpRing = 0; iOpRing < psObject->nParts; iOpRing++) + { + const int nVertStart = psObject->panPartStart[iOpRing]; + const int nVertCount = SHPGetPartVertexCount(psObject, iOpRing); if (nVertCount < 2) continue; - bInner = SHPRewindIsInnerRing(psObject, iOpRing); - -/* -------------------------------------------------------------------- */ -/* Determine the current order of this ring so we will know if */ -/* it has to be reversed. */ -/* -------------------------------------------------------------------- */ + /* If a ring has a non-constant Z value, then consider it as an outer */ + /* ring. */ + /* NOTE: this is a rough approximation. If we were smarter, */ + /* we would check that all points of the ring are coplanar, and compare + */ + /* that to other rings in the same (oblique) plane. */ + int bDoIsInnerRingTest = TRUE; + if (!bSameZ) + { + int bPartSameZ = TRUE; + for (int iVert = nVertStart + 1; iVert < nVertStart + nVertCount; + ++iVert) + { + if (psObject->padfZ[iVert] != psObject->padfZ[nVertStart]) + { + bPartSameZ = FALSE; + break; + } + } + if (!bPartSameZ) + bDoIsInnerRingTest = FALSE; + } - dfSum = psObject->padfX[nVertStart] * - (psObject->padfY[nVertStart+1] - - psObject->padfY[nVertStart+nVertCount-1]); - for( iVert = nVertStart + 1; iVert < nVertStart+nVertCount-1; iVert++ ) + int bInner = FALSE; + if (bDoIsInnerRingTest) { - dfSum += psObject->padfX[iVert] * (psObject->padfY[iVert+1] - - psObject->padfY[iVert-1]); + for (int iTolerance = 0; iTolerance < 2; iTolerance++) + { + /* In a first attempt, use a relaxed criterion to decide if a + * point */ + /* is inside another ring. If all points of the current ring are + * in the */ + /* "grey" zone w.r.t that criterion, which seems really + * unlikely, */ + /* then use the strict criterion for another pass. */ + const double dfRelativeTolerance = (iTolerance == 0) ? 1e-9 : 0; + for (int iVert = nVertStart; + iVert + 1 < nVertStart + nVertCount; ++iVert) + { + /* Use point in the middle of segment to avoid testing + * common points of rings. + */ + const double dfTestX = + (psObject->padfX[iVert] + psObject->padfX[iVert + 1]) / + 2; + const double dfTestY = + (psObject->padfY[iVert] + psObject->padfY[iVert + 1]) / + 2; + const double dfTestZ = + !bSameZ ? psObject->padfZ[nVertStart] : 0; + + bInner = SHPRewindIsInnerRing(psObject, iOpRing, dfTestX, + dfTestY, dfRelativeTolerance, + bSameZ, dfTestZ); + if (bInner >= 0) + break; + } + if (bInner >= 0) + break; + } + if (bInner < 0) + { + /* Completely degenerate case. Do not bother touching order. */ + continue; + } } - dfSum += psObject->padfX[iVert] * (psObject->padfY[nVertStart] - - psObject->padfY[iVert-1]); + /* -------------------------------------------------------------------- */ + /* Determine the current order of this ring so we will know if */ + /* it has to be reversed. */ + /* -------------------------------------------------------------------- */ -/* -------------------------------------------------------------------- */ -/* Reverse if necessary. */ -/* -------------------------------------------------------------------- */ - if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) + double dfSum = psObject->padfX[nVertStart] * + (psObject->padfY[nVertStart + 1] - + psObject->padfY[nVertStart + nVertCount - 1]); + int iVert = nVertStart + 1; + for (; iVert < nVertStart + nVertCount - 1; iVert++) { - int i; + dfSum += psObject->padfX[iVert] * + (psObject->padfY[iVert + 1] - psObject->padfY[iVert - 1]); + } + dfSum += psObject->padfX[iVert] * + (psObject->padfY[nVertStart] - psObject->padfY[iVert - 1]); + + /* -------------------------------------------------------------------- */ + /* Reverse if necessary. */ + /* -------------------------------------------------------------------- */ + if ((dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner)) + { bAltered++; - for( i = 0; i < nVertCount/2; i++ ) + for (int i = 0; i < nVertCount / 2; i++) { - double dfSaved; - /* Swap X */ - dfSaved = psObject->padfX[nVertStart+i]; - psObject->padfX[nVertStart+i] = - psObject->padfX[nVertStart+nVertCount-i-1]; - psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; + double dfSaved = psObject->padfX[nVertStart + i]; + psObject->padfX[nVertStart + i] = + psObject->padfX[nVertStart + nVertCount - i - 1]; + psObject->padfX[nVertStart + nVertCount - i - 1] = dfSaved; /* Swap Y */ - dfSaved = psObject->padfY[nVertStart+i]; - psObject->padfY[nVertStart+i] = - psObject->padfY[nVertStart+nVertCount-i-1]; - psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; + dfSaved = psObject->padfY[nVertStart + i]; + psObject->padfY[nVertStart + i] = + psObject->padfY[nVertStart + nVertCount - i - 1]; + psObject->padfY[nVertStart + nVertCount - i - 1] = dfSaved; /* Swap Z */ - if( psObject->padfZ ) + if (psObject->padfZ) { - dfSaved = psObject->padfZ[nVertStart+i]; - psObject->padfZ[nVertStart+i] = - psObject->padfZ[nVertStart+nVertCount-i-1]; - psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; + dfSaved = psObject->padfZ[nVertStart + i]; + psObject->padfZ[nVertStart + i] = + psObject->padfZ[nVertStart + nVertCount - i - 1]; + psObject->padfZ[nVertStart + nVertCount - i - 1] = dfSaved; } /* Swap M */ - if( psObject->padfM ) + if (psObject->padfM) { - dfSaved = psObject->padfM[nVertStart+i]; - psObject->padfM[nVertStart+i] = - psObject->padfM[nVertStart+nVertCount-i-1]; - psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; + dfSaved = psObject->padfM[nVertStart + i]; + psObject->padfM[nVertStart + i] = + psObject->padfM[nVertStart + nVertCount - i - 1]; + psObject->padfM[nVertStart + nVertCount - i - 1] = dfSaved; } } } diff --git a/skytraq.cc b/skytraq.cc index fe4ebb63a..f6df657af 100644 --- a/skytraq.cc +++ b/skytraq.cc @@ -24,11 +24,12 @@ */ #include // for isprint -#include // for cos, sin, atan2, pow, sqrt, M_PI +#include // for cos, sin, atan2, pow, sqrt #include // for va_end, va_list, va_start #include // for sscanf, snprintf, vprintf, SEEK_SET #include // for free #include // for memset +#include // for inv_pi, pi #include // for QByteArray #include // for QChar @@ -209,7 +210,9 @@ int SkytraqBase::skytraq_rd_msg(void* payload, unsigned int len) const { int errors = 5; // Allow this many receiver errors silently. - unsigned int c, i, state; + unsigned int c; + unsigned int i; + unsigned int state; signed int rcv_len; // Negative length is read error. for (i = 0, state = 0; i < RETRIES && state < sizeof(MSG_START); i++) { @@ -417,7 +420,10 @@ SkytraqBase::skytraq_configure_logging() const { // an0008-1.4.14: logs if // (dt > tmin & dd >= dmin & v >= vmin) | dt > tmax | dd > dmax | v > vmax - unsigned int tmin=6, tmax=3600, dmin=0, dmax=10000; + unsigned int tmin=6; + unsigned int tmax=3600; + unsigned int dmin=0; + unsigned int dmax=10000; static uint8_t MSG_LOG_CONFIGURE_CONTROL[] = { 0x18, // message_id 0x00, 0x00, 0x0e, 0x10, // max_time: was 0x0000ffff (big endian!) @@ -576,12 +582,12 @@ SkytraqBase::ECEF_to_LLA(double x, double y, long z, double* lat, double* lon, d /* height above ellipsoid (in meters): */ *alt = AP/cos(*lat) - CA/sqrt(1 - CE2 * pow(sin(*lat), 2)); - *lat = *lat /M_PI*180; - *lon = *lon /M_PI*180; + *lat = *lat * std::numbers::inv_pi * 180; + *lon = *lon * std::numbers::inv_pi * 180; } void -SkytraqBase::state_init(struct read_state* pst) +SkytraqBase::state_init(read_state* pst) { auto* track = new route_head; track->rte_name = "SkyTraq tracklog"; @@ -600,7 +606,7 @@ SkytraqBase::state_init(struct read_state* pst) } Waypoint* -SkytraqBase::make_trackpoint(struct read_state* st, double lat, double lon, double alt) const +SkytraqBase::make_trackpoint(read_state* st, double lat, double lon, double alt) const { auto* wpt = new Waypoint; @@ -623,7 +629,7 @@ SkytraqBase::make_trackpoint(struct read_state* st, double lat, double lon, doub #define ITEM_SPEED(item) (item->type_and_speed[1] | ((item->type_and_speed[0] & 0x0F) << 8)) int -SkytraqBase::process_data_item(struct read_state* pst, const item_frame* pitem, int len) const +SkytraqBase::process_data_item(read_state* pst, const item_frame* pitem, int len) const { int res = 0; double lat; @@ -766,9 +772,10 @@ SkytraqBase::process_data_item(struct read_state* pst, const item_frame* pitem, } int /* returns number of bytes processed (terminates on 0xFF i.e. empty or padding bytes) */ -SkytraqBase::process_data_sector(struct read_state* pst, const uint8_t* buf, int len) const +SkytraqBase::process_data_sector(read_state* pst, const uint8_t* buf, int len) const { - int plen, ilen; + int plen; + int ilen; for (plen = 0; plen < len && buf[plen] != 0xFF; plen += ilen) { ilen = process_data_item(pst, reinterpret_cast(&buf[plen]), len-plen); @@ -787,7 +794,10 @@ SkytraqBase::skytraq_read_single_sector(unsigned int sector, uint8_t* buf) const { uint8_t MSG_LOG_SECTOR_READ_CONTROL[2] = { 0x1B, (uint8_t)(sector) }; int errors = 5; /* allow this many errors */ - unsigned int c, i, j, cs; + unsigned int c; + unsigned int i; + unsigned int j; + unsigned int cs; uint8_t buffer[16]; if (sector > 0xFF) { @@ -924,10 +934,17 @@ SkytraqBase::skytraq_read_multiple_sectors(int first_sector, unsigned int sector void SkytraqBase::skytraq_read_tracks() const { - struct read_state st; + read_state st; uint32_t log_wr_ptr; - uint16_t sectors_free, sectors_total, /*sectors_used_a, sectors_used_b,*/ sectors_used; - int t, rc, got_sectors, total_sectors_read = 0; + uint16_t sectors_free; + uint16_t sectors_total; + /* uint16_t sectors_used_a; */ + /* uint16_t sectors_used_b; */ + uint16_t sectors_used; + int t; + int rc; + int got_sectors; + int total_sectors_read = 0; int read_at_once = MAX(xstrtoi(opt_read_at_once, nullptr, 10), 1); int opt_first_sector_val = xstrtoi(opt_first_sector, nullptr, 10); int opt_last_sector_val = xstrtoi(opt_last_sector, nullptr, 10); @@ -1142,7 +1159,8 @@ SkytraqBase::skytraq_erase() const void SkytraqBase::skytraq_set_location() const { - double lat, lng; + double lat; + double lng; uint8_t MSG_SET_LOCATION[17] = { 0x36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; uint8_t MSG_GET_LOCATION = 0x35; @@ -1240,7 +1258,7 @@ SkytraqfileFormat::rd_deinit() void SkytraqfileFormat::read() { - struct read_state st; + read_state st; int got_bytes; int opt_first_sector_val = xstrtoi(opt_first_sector, nullptr, 10); int opt_last_sector_val = xstrtoi(opt_last_sector, nullptr, 10); @@ -1305,8 +1323,8 @@ void MinihomerFormat::lla2ecef(double lat, double lng, double alt, double* ecef_ long double a = 6378137.0; long double esqr = 6.69437999014e-3; - long double llat = lat*M_PI/180; - long double llng = lng*M_PI/180; + long double llat = lat * std::numbers::pi / 180; + long double llng = lng * std::numbers::pi / 180; long double lalt = alt; long double s = sin(llat); @@ -1320,7 +1338,9 @@ void MinihomerFormat::miniHomer_get_poi() const { uint8_t MSG_GET_POI[3] = { 0x4D, 0, 0}; uint8_t buf[32]; - double lat, lng, alt; + double lat; + double lng; + double alt; for (unsigned int poi = 0; poi>8)&0xff; @@ -1368,8 +1388,12 @@ int MinihomerFormat::miniHomer_set_poi(uint16_t poinum, const char* opt_poi) con 0, 0, 0, 0, 0, 0, 0, 0, //alt (double ecef) 0 // attr (u8, 1-> to flash, 0->ro sram) }; - double lat, lng, alt; - double ecef_x, ecef_y, ecef_z; + double lat; + double lng; + double alt; + double ecef_x; + double ecef_y; + double ecef_z; int result = 0; // result will be 0 if opt_poi isn't set diff --git a/smplrout.cc b/smplrout.cc index 0e5985ec4..eb5388126 100644 --- a/smplrout.cc +++ b/smplrout.cc @@ -57,7 +57,7 @@ */ #include -#include // for strtol +#include // for strtod, strtol #include // for prev #include // for QDateTime @@ -97,18 +97,15 @@ double SimplifyRouteFilter::compute_track_error(const neighborhood& nb) const switch (metric) { case metric_t::crosstrack: track_error = radtomiles(linedist( - wpt1->latitude, wpt1->longitude, - wpt2->latitude, wpt2->longitude, - wpt3->latitude, wpt3->longitude)); + wpt1->position(), + wpt2->position(), + wpt3->position())); break; case metric_t::length: track_error = radtomiles( - gcdist(wpt1->latitude, wpt1->longitude, - wpt3->latitude, wpt3->longitude) + - gcdist(wpt3->latitude, wpt3->longitude, - wpt2->latitude, wpt2->longitude) - - gcdist(wpt1->latitude, wpt1->longitude, - wpt2->latitude, wpt2->longitude)); + gcdist(wpt1->position(), wpt3->position()) + + gcdist(wpt3->position(), wpt2->position()) - + gcdist(wpt1->position(), wpt2->position())); break; case metric_t::relative: default: // eliminate false positive warning with g++ 11.3.0: ‘error’ may be used uninitialized in this function [-Wmaybe-uninitialized] @@ -119,18 +116,15 @@ double SimplifyRouteFilter::compute_track_error(const neighborhood& nb) const (wpt1->GetCreationTime() != wpt2->GetCreationTime())) { double frac = static_cast(wpt1->GetCreationTime().msecsTo(wpt3->GetCreationTime())) / static_cast(wpt1->GetCreationTime().msecsTo(wpt2->GetCreationTime())); - double reslat, reslon; - linepart(wpt1->latitude, wpt1->longitude, - wpt2->latitude, wpt2->longitude, - frac, &reslat, &reslon); - track_error = radtometers(gcdist( - wpt3->latitude, wpt3->longitude, - reslat, reslon)); + auto respos = linepart(wpt1->position(), + wpt2->position(), + frac); + track_error = radtometers(gcdist(wpt3->position(), respos)); } else { // else distance to connecting line track_error = radtometers(linedist( - wpt1->latitude, wpt1->longitude, - wpt2->latitude, wpt2->longitude, - wpt3->latitude, wpt3->longitude)); + wpt1->position(), + wpt2->position(), + wpt3->position())); } // error relative to horizontal precision track_error /= (6 * wpt3->hdop); @@ -209,7 +203,7 @@ void SimplifyRouteFilter::routesimple_head(const route_head* rte) neighborhood goner = errormap.last(); goner.wpt->wpt_flags.marked_for_deletion = 1; // errormap.remove(lastKey()); // with Qt 5.12.12, 5.15.2 results in asan heap-use-after-free errors in build_extra_tests.sh - errormap.erase(std::prev(errormap.end())); // in Qt6 can use cend(). + errormap.erase(std::prev(errormap.cend())); // in Qt6 can use cend(). // wpthash.remove(goner.wpt); // removal not necessary /* recompute neighbors of point marked for deletion. */ @@ -296,11 +290,15 @@ void SimplifyRouteFilter::init() count = strtol(countopt, nullptr, 10); break; case limit_basis_t::error: { - int res = parse_distance(erroropt, &error, 1.0, MYNAME); - if (res == 0) { - error = 0; - } else if (res == 2) { /* parameter with unit */ - error = METERS_TO_MILES(error); + if (metric == metric_t::relative) { + error = strtod(erroropt, nullptr); + } else { + int res = parse_distance(erroropt, &error, 1.0, MYNAME); + if (res == 0) { + error = 0; + } else if (res == 2) { /* parameter with unit */ + error = METERS_TO_MILES(error); + } } } break; diff --git a/src/core/datetime.h b/src/core/datetime.h index 93b60b34f..579c50089 100644 --- a/src/core/datetime.h +++ b/src/core/datetime.h @@ -37,9 +37,11 @@ // "Better" code in the callers. // Consider putting in a namespace instead of prefixing 'gb'. -namespace gpsbabel { +namespace gpsbabel +{ -class DateTime : public QDateTime { +class DateTime : public QDateTime +{ public: // As a crutch, mimic the old behaviour of an uninitialized creation time // being 1/1/1970. @@ -52,35 +54,38 @@ class DateTime : public QDateTime { // Qt::LocalTime compared to Qt::UTC on ubuntu bionic. // Note that these conversions can be required if the Qt::TimeSpec is // set to Qt:LocalTime after construction. - DateTime() : QDateTime(QDateTime::fromMSecsSinceEpoch(0, Qt::UTC)) { + DateTime() : QDateTime(QDateTime::fromMSecsSinceEpoch(0, Qt::UTC)) + { } DateTime(const QDate& date, const QTime& time) : QDateTime(date, time) {} DateTime(const QDateTime& dt) : QDateTime(dt) {} // Temporary: Override the standard, also handle time_t 0 as invalid. - bool isValid() const { + [[nodiscard]] bool isValid() const + { return QDateTime::isValid() && (toSecsSinceEpoch() != 0); } // Like toString, but with subsecond time that's included only when // the trailing digits aren't .000. Always UTC. - QString toPrettyString() const { - if (time().msec()) { + [[nodiscard]] QString toPrettyString() const + { + if (time().msec() != 0) { return toUTC().toString(QStringLiteral("yyyy-MM-ddTHH:mm:ss.zzzZ")); - } else { - return toUTC().toString(QStringLiteral("yyyy-MM-ddTHH:mm:ssZ")); } + return toUTC().toString(QStringLiteral("yyyy-MM-ddTHH:mm:ssZ")); } // QDateTime::toTime_t was deprecated in Qt5.8, and deleted in Qt6. - uint32_t toTime_t() const { + [[nodiscard]] uint32_t toTime_t() const + { if (!QDateTime::isValid()) { - return -1; + return UINT32_MAX; } long long secs_since_epoch = toSecsSinceEpoch(); - if ((secs_since_epoch < 0) || (secs_since_epoch > 0xfffffffe)) { - return -1; + if ((secs_since_epoch < 0) || (secs_since_epoch >= UINT32_MAX)) { + return UINT32_MAX; } return secs_since_epoch; } diff --git a/src/core/logging.h b/src/core/logging.h index c3932d992..a41733752 100644 --- a/src/core/logging.h +++ b/src/core/logging.h @@ -66,17 +66,4 @@ class Debug : public QDebug explicit Debug(int l) : QDebug(QtDebugMsg) {nospace().noquote() << DebugIndent(l);} }; -/* - * Kludge any used QTextStream modifiers into Qt namespace as they are in newer - * versions of Qt. This makes source compatiblity easier. - */ -#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) -namespace Qt -{ - inline QTextStream& dec(QTextStream &s) { return ::dec(s); } - inline QTextStream& hex(QTextStream &s) { return ::hex(s); } - inline QTextStream& endl(QTextStream &s) { return ::endl(s); } - inline QTextStream& uppercasedigits(QTextStream &s) { return ::uppercasedigits(s); } -} -#endif #endif // SRC_CORE_LOGGING_H_ diff --git a/src/core/nvector.cc b/src/core/nvector.cc index a35efc691..f6e8ad894 100644 --- a/src/core/nvector.cc +++ b/src/core/nvector.cc @@ -20,14 +20,13 @@ // https://en.wikipedia.org/wiki/N-vector // http://www.navlab.net/Publications/A_Nonsingular_Horizontal_Position_Representation.pdf -#include -#include -#include -#include -#include +#include "src/core/nvector.h" -#include "nvector.h" -#include "vector3d.h" +#include // for DBL_EPSILON +#include // for sqrt, atan2, cos, nan, sin, cbrt +#include // for pair + +#include "src/core/vector3d.h" // for Vector3D namespace gpsbabel { @@ -401,7 +400,7 @@ double NVector::crossTrackDistance(const NVector& n_EA_E, const NVector& n_EB_E, { Vector3D c_E = crossProduct(n_EA_E, n_EB_E).normalize(); double result = fabs((atan2(crossProduct(c_E, n_EX_E).norm(), - dotProduct(c_E, n_EX_E)) - M_PI/2.0)) * MEAN_EARTH_RADIUS_METERS; + dotProduct(c_E, n_EX_E)) - std::numbers::pi/2.0)) * MEAN_EARTH_RADIUS_METERS; return result; } #else diff --git a/src/core/nvector.h b/src/core/nvector.h index 4cd7b820f..03d4c7f6f 100644 --- a/src/core/nvector.h +++ b/src/core/nvector.h @@ -20,8 +20,10 @@ #ifndef NVECTOR_H #define NVECTOR_H -#include "defs.h" -#include "vector3d.h" +#include // for pi +#include // for pair + +#include "src/core/vector3d.h" // for Vector3D namespace gpsbabel { @@ -42,7 +44,7 @@ constexpr double WGS84_ASPECT_RATIO = 1.0 - WGS84_FLATTENING; // b/a constexpr double WGS84_SEMI_MINOR_AXIS_METERS = WGS84_SEMI_MAJOR_AXIS_METERS * WGS84_ASPECT_RATIO; // b constexpr double WGS84_ECCENTRICITY_SQUARED = 1.0 - (WGS84_ASPECT_RATIO * WGS84_ASPECT_RATIO); -constexpr double kRadiansPerDegree = M_PI/180.0; +constexpr double kRadiansPerDegree = std::numbers::pi / 180.0; constexpr double kDegreesPerRadian = 1.0/kRadiansPerDegree; class PVector; diff --git a/src/core/textstream.cc b/src/core/textstream.cc index a4a899ec4..e3a62cdae 100644 --- a/src/core/textstream.cc +++ b/src/core/textstream.cc @@ -18,22 +18,16 @@ */ -#include // for qint64, QT_VERSION, QT_VERSION_CHECK +#include // for qint64 -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #include // for QByteArrayView -#endif #include // for QFile #include // for QFlags #include // for QIODevice -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #include // for QIODeviceBase::OpenMode #include // for QStringConverter, QStringConverter::Utf8, QStringConverter::Encoding, QStringConverter::Utf16 -#endif -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #include // for optional -#endif #include "defs.h" // for fatal, list_codecs #include "src/core/textstream.h" @@ -45,31 +39,6 @@ namespace gpsbabel void TextStream::open(const QString& fname, QIODevice::OpenMode mode, const char* module, const char* codec_name) { -#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) - codec_ = QTextCodec::codecForName(codec_name); - if (codec_ == nullptr) { - list_codecs(); - fatal("%s: Unsupported codec '%s'.\n", module, codec_name); - } - - file_ = new gpsbabel::File(fname); - file_->open(mode); - setDevice(file_); - setCodec(codec_); - - if (mode & QFile::ReadOnly) { - if (codec_->mibEnum() == 106) { // UTF-8 - setAutoDetectUnicode(true); - } - } - - if (mode & QFile::WriteOnly) { - // enable bom for all UTF codecs except UTF-8 - if (codec_->mibEnum() != 106) { - setGenerateByteOrderMark(true); - } - } -#else std::optional encoding = QStringConverter::encodingForName(codec_name); bool use_stringconverter = encoding.has_value(); @@ -116,7 +85,6 @@ void TextStream::open(const QString& fname, QIODevice::OpenMode mode, const char setDevice(device_); setEncoding(QStringConverter::Utf16); } -#endif } void TextStream::close() @@ -127,15 +95,11 @@ void TextStream::close() delete file_; file_ = nullptr; } -#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) - codec_ = nullptr; -#else if (device_ != nullptr) { device_->close(); delete device_; device_ = nullptr; } -#endif } } // namespace gpsbabel diff --git a/src/core/textstream.h b/src/core/textstream.h index 52aa59667..93f09bbfe 100644 --- a/src/core/textstream.h +++ b/src/core/textstream.h @@ -19,21 +19,13 @@ #ifndef SRC_CORE_TEXTSTREAM_INCLUDED_H_ #define SRC_CORE_TEXTSTREAM_INCLUDED_H_ -#include // for QT_VERSION, QT_VERSION_CHECK #include // for QIODevice -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #include // for QIODeviceBase::OpenMode -#endif #include // for QString -#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) -#include // for QTextCodec -#endif #include // for QTextStream -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #include "src/core/codecdevice.h" // for CodecDevice -#endif #include "src/core/file.h" // for File @@ -48,11 +40,7 @@ class TextStream : public QTextStream private: gpsbabel::File* file_{nullptr}; -#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) - QTextCodec* codec_{nullptr}; -#else gpsbabel::CodecDevice* device_{nullptr}; -#endif }; } // namespace gpsbabel diff --git a/src/core/usasciicodec.h b/src/core/usasciicodec.h index db002278c..b6e32f922 100644 --- a/src/core/usasciicodec.h +++ b/src/core/usasciicodec.h @@ -31,8 +31,8 @@ class UsAsciiCodec : public QTextCodec QByteArray name() const override; QList aliases() const override; int mibEnum() const override; - QString convertToUnicode(const char*, int, ConverterState*) const override; - QByteArray convertFromUnicode(const QChar*, int, ConverterState*) const override; + QString convertToUnicode(const char* chars, int len, ConverterState* state) const override; + QByteArray convertFromUnicode(const QChar* uc, int len, ConverterState* state) const override; }; } // namespace gpsbabel diff --git a/src/core/xmlstreamwriter.cc b/src/core/xmlstreamwriter.cc index 307dc6ffb..1ce72f1c3 100644 --- a/src/core/xmlstreamwriter.cc +++ b/src/core/xmlstreamwriter.cc @@ -23,6 +23,8 @@ #include // for QXmlStreamWriter #include // for QT_VERSION, QT_VERSION_CHECK +#include "defs.h" + // As this code began in C, we have several hundred places that write // c strings. Add a test that the string contains anything useful // before serializing an empty tag. @@ -41,7 +43,96 @@ namespace gpsbabel { -// Dont emit the element if there's nothing interesting in it. +XmlStreamWriter::xml_stack_list_entry_t& XmlStreamWriter::activeStack() +{ + if (stack_list.isEmpty()) { + fatal("xmlstreamwriter: programming error: the stack* functions are used incorrectly."); + } + return stack_list.last(); +} + +void XmlStreamWriter::stackAttribute(const QString& name, const QString& value) +{ + activeStack().append(xml_command(xml_wrt_cmd_t::attribute, name, value)); +} + +void XmlStreamWriter::stackEndElement() +{ + xml_stack_list_entry_t& active_stack = activeStack(); + active_stack.append(xml_command(xml_wrt_cmd_t::end_element)); + + // Has the active_stack OptionalStartElement been paired with an EndElement? + if (active_stack.element_depth == 0) { // yes + const xml_stack_list_entry_t completed_stack = stack_list.takeLast(); + // Does the completed_stack OptionalStartElement have any content? + if (completed_stack.element_count > 1) { // yes + // Is this the initial OptionalStartElement? + if (!stack_list.isEmpty()) { // no. append stack contents to parent. + stack_list.last().append(completed_stack); + } else { // yes. write the stack contents. + for (const auto& command: completed_stack.stack) { + switch (command.type) { + case xml_wrt_cmd_t::start_element: + QXmlStreamWriter::writeStartElement(command.name); + break; + case xml_wrt_cmd_t::attribute: + QXmlStreamWriter::writeAttribute(command.name, command.value); + break; + case xml_wrt_cmd_t::name_space: + QXmlStreamWriter::writeNamespace(command.name, command.value); + break; + case xml_wrt_cmd_t::text_element: + QXmlStreamWriter::writeTextElement(command.name, command.value); + break; + case xml_wrt_cmd_t::end_element: + QXmlStreamWriter::writeEndElement(); + break; + } + } + } + } // else {no. empty OptionalStartElement is discarded.} + } +} + +void XmlStreamWriter::stackNamespace(const QString& namespaceUri, const QString& prefix) +{ + activeStack().append(xml_command(xml_wrt_cmd_t::name_space, namespaceUri, prefix)); +} + +/* + * Start an element that will be written if and only if it has children. + * + * Usage: + * 1. stackOptionalStartElement must be the first stack*() method called. + * 2. stackOptionalStartElement must be paired with a subsequent + * stackEndElement. + * 3. write*() methods should not be called until the initial optional start + * element has paired with a subsequent stackEndElement. + */ +void XmlStreamWriter::stackOptionalStartElement(const QString& name) +{ + stack_list.append(xml_stack_list_entry_t()); + stackStartElement(name); +} + +void XmlStreamWriter::stackOptionalTextElement(const QString& name, const QString& text) +{ + if (!text.isEmpty()) { + stackTextElement(name, text); + } +} + +void XmlStreamWriter::stackStartElement(const QString& name) +{ + activeStack().append(xml_command(xml_wrt_cmd_t::start_element, name)); +} + +void XmlStreamWriter::stackTextElement(const QString& name, const QString& text) +{ + activeStack().append(xml_command(xml_wrt_cmd_t::text_element, name, text)); +} + +// Don't emit the element if there's nothing interesting in it. void XmlStreamWriter::writeOptionalTextElement(const QString& qualifiedName, const QString& text) { if (!text.isEmpty()) { diff --git a/src/core/xmlstreamwriter.h b/src/core/xmlstreamwriter.h index 24097da6b..2d0372f4d 100644 --- a/src/core/xmlstreamwriter.h +++ b/src/core/xmlstreamwriter.h @@ -20,8 +20,10 @@ #ifndef XMLSTREAMWRITER_H #define XMLSTREAMWRITER_H -#include // for QString -#include // for QXmlStreamWriter +#include // for QList +#include // for QString +#include // for QXmlStreamWriter +#include namespace gpsbabel { @@ -31,7 +33,82 @@ class XmlStreamWriter : public QXmlStreamWriter public: using QXmlStreamWriter::QXmlStreamWriter; + /* Member Functions */ + + void stackAttribute(const QString& name, const QString& value); + void stackEndElement(); + void stackNamespace(const QString& namespaceUri, const QString& prefix); + void stackOptionalStartElement(const QString& name); + void stackOptionalTextElement(const QString& name, const QString& text); + void stackStartElement(const QString& name); + void stackTextElement(const QString& name, const QString& text); + void writeOptionalTextElement(const QString& qualifiedName, const QString& text); + +private: + /* Types */ + + enum class xml_wrt_cmd_t { + start_element, + attribute, + name_space, + text_element, + end_element + }; + + struct xml_command { + explicit xml_command(xml_wrt_cmd_t t, + QString n = QString(), + QString v = QString()) + : type(t), name(std::move(n)), value(std::move(v)) {} + + xml_wrt_cmd_t type; + QString name; + QString value; + }; + + using xml_stack_t = QList; + + struct xml_stack_list_entry_t { + void append(const xml_stack_list_entry_t& other) + { + stack.append(other.stack); + element_count += other.element_count; + } + + void append(const xml_command& cmd) + { + stack.append(cmd); + switch (cmd.type) { + case xml_wrt_cmd_t::start_element: + ++element_count; + ++element_depth; + break; + case xml_wrt_cmd_t::text_element: + ++element_count; + break; + case xml_wrt_cmd_t::end_element: + --element_depth; + break; + case xml_wrt_cmd_t::attribute: + case xml_wrt_cmd_t::name_space: + break; + } + } + + xml_stack_t stack; + int element_count{0}; + int element_depth{0}; + }; + + /* Member Functions */ + + xml_stack_list_entry_t& activeStack(); + + /* Data Members */ + + QList stack_list; + }; } // namespace gpsbabel diff --git a/src/core/xmltag.cc b/src/core/xmltag.cc index 2376bce3d..717979ea4 100644 --- a/src/core/xmltag.cc +++ b/src/core/xmltag.cc @@ -91,7 +91,7 @@ free_xml_tag(XmlTag* tag) // FIXME: at some point, this becomes a plain ole copy constructor. static void -copy_xml_tag(XmlTag** copy, XmlTag* src, XmlTag* parent) +copy_xml_tag(XmlTag** copy, const XmlTag* src, XmlTag* parent) { if (!src) { *copy = nullptr; diff --git a/style/cup.style b/style/cup.style new file mode 100644 index 000000000..2803b760d --- /dev/null +++ b/style/cup.style @@ -0,0 +1,46 @@ +# +# (c) 2006, Robert Lipe, based on sample files by Krzysztof Wojtas +# Reference info: http://www.seeyou.ws/thankyou.php?fname=cup_format.pdf +# Reference info: http://download.naviter.com/docs/cup_format.pdf +# Reference info: http://www.keepitsoaring.com/LKSC/Downloads/cup_format.pdf +# + +DESCRIPTION See You flight analysis data +SHORTLEN 8 +EXTENSION cup +# +# +# FILE LAYOUT DEFINITIIONS: +# +FIELD_DELIMITER COMMA +RECORD_DELIMITER NEWLINE +BADCHARS ," +PROLOGUE name,code,country,lat,lon,elev,style,rwdir,rwlen,freq,desc +EPILOGUE -----Related Tasks----- + + +IFIELD IGNORE,"", ""%s"" +IFIELD SHORTNAME,"", "%s" +IFIELD CONSTANT,"", "" +IFIELD LAT_DDMMDIR, "%f", "%08.3f", "absolute" +IFIELD LON_DDMMDIR, "%f", "%09.3f", "absolute" +IFIELD ALT_METERS,"", "%dm" +IFIELD CONSTANT,"", "1" +IFIELD CONSTANT,"", "" +IFIELD CONSTANT,"", "" +IFIELD CONSTANT,"", "" +IFIELD DESCRIPTION,"", ""%s"" + +OFIELD SHORTNAME,"", ""%s"" +OFIELD SHORTNAME,"", "%s" +OFIELD CONSTANT,"", "" +OFIELD LAT_DDMMDIR, "", "%08.3f%c" +OFIELD LON_DDMMDIR, "", "%09.3f%c" +OFIELD ALT_METERS,"", "%3.1fm" +OFIELD CONSTANT,"", "1" +OFIELD CONSTANT,"", "" +OFIELD CONSTANT,"", "" +OFIELD CONSTANT,"", "" +OFIELD DESCRIPTION,"", ""%s"" + + diff --git a/subrip.cc b/subrip.cc index 1fda7ad07..ee6116b58 100644 --- a/subrip.cc +++ b/subrip.cc @@ -210,13 +210,13 @@ SubripFormat::wr_init(const QString& fname) } gps_datetime = QDateTime(); if ((opt_gpstime != nullptr) && (opt_gpsdate != nullptr)) { - QDate gps_date = QDate::fromString(opt_gpsdate, "yyyyMMdd"); + QDate gps_date = QDate::fromString(opt_gpsdate, u"yyyyMMdd"); if (!gps_date.isValid()) { fatal(FatalMsg().nospace() << MYNAME ": option gps_date value (" << opt_gpsdate << ") is invalid. Expected yyyymmdd."); } - QTime gps_time = QTime::fromString(opt_gpstime, "HHmmss"); + QTime gps_time = QTime::fromString(opt_gpstime, u"HHmmss"); if (!gps_time.isValid()) { - gps_time = QTime::fromString(opt_gpstime, "HHmmss.z"); + gps_time = QTime::fromString(opt_gpstime, u"HHmmss.z"); if (!gps_time.isValid()) { fatal(FatalMsg().nospace() << MYNAME ": option gps_time value (" << opt_gpstime << ") is invalid. Expected hhmmss[.sss]"); } @@ -226,9 +226,9 @@ SubripFormat::wr_init(const QString& fname) video_offset_ms = 0; if (opt_videotime != nullptr) { - QTime video_time = QTime::fromString(opt_videotime, "HHmmss"); + QTime video_time = QTime::fromString(opt_videotime, u"HHmmss"); if (!video_time.isValid()) { - video_time = QTime::fromString(opt_videotime, "HHmmss.z"); + video_time = QTime::fromString(opt_videotime, u"HHmmss.z"); if (!video_time.isValid()) { fatal(FatalMsg().nospace() << MYNAME ": option video_time value (" << opt_videotime << ") is invalid. Expected hhmmss[.sss]."); } diff --git a/testo.d/bend.test b/testo.d/bend.test index bf6e81a82..349842a58 100644 --- a/testo.d/bend.test +++ b/testo.d/bend.test @@ -3,3 +3,7 @@ rm -f ${TMPDIR}/bend.* gpsbabel -i gpx -f ${REFERENCE}/route/bend-input.gpx -x bend,distance=25,minangle=5 -o gpx -F ${TMPDIR}/bend.gpx compare ${REFERENCE}/route/bend-expected.gpx ${TMPDIR}/bend.gpx + +# Although not a real useful use case, test with extremly long segments to check great circle usage. +gpsbabel -i kml -f ${REFERENCE}/route/bendgc-input.kml -x transform,rte=trk,del -x bend,distance=1000000,minangle=5 -o gpx -F ${TMPDIR}/bendgc-expected.gpx +compare ${REFERENCE}/route/bendgc-expected.gpx ${TMPDIR}/bendgc-expected.gpx diff --git a/testo.d/duplicate.test b/testo.d/duplicate.test index ff8aaa5e4..c6dad28ab 100644 --- a/testo.d/duplicate.test +++ b/testo.d/duplicate.test @@ -7,8 +7,3 @@ gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o csv -F ${TMPDIR}/filterdupe.cs gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -f ${REFERENCE}/geocaching.loc -x duplicate,shortname \ -o csv -F ${TMPDIR}/filterdupe.csv2 sort_and_compare ${TMPDIR}/filterdupe.csv1 ${TMPDIR}/filterdupe.csv2 - -gpsbabel -i unicsv,utc -f ${REFERENCE}/duplicate_exported_1.csv -x duplicate,location -o unicsv,utc -F ${TMPDIR}/duplicate_exported_1~csv.csv -compare ${REFERENCE}/duplicate_exported_1~csv.csv ${TMPDIR}/duplicate_exported_1~csv.csv -gpsbabel -i unicsv,utc -f ${REFERENCE}/duplicate_exported_2.csv -x duplicate,location -o unicsv,utc -F ${TMPDIR}/duplicate_exported_2~csv.csv -compare ${REFERENCE}/duplicate_exported_2~csv.csv ${TMPDIR}/duplicate_exported_2~csv.csv diff --git a/testo.d/garmin_gpi.test b/testo.d/garmin_gpi.test index a58c3b175..57faa0936 100644 --- a/testo.d/garmin_gpi.test +++ b/testo.d/garmin_gpi.test @@ -17,7 +17,7 @@ compare ${REFERENCE}/gpi_ext-sample.csv ${TMPDIR}/gpi_ext-sample.csv # Don't test writing this sample file from garminonline.de/extras/poi, but # prove we can read it -gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,gpxver=1.1 -F ${TMPDIR}/umsonstdraussen.gpx +gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,garminextensions -F ${TMPDIR}/umsonstdraussen.gpx compare ${REFERENCE}/umsonstdraussen.gpx ${TMPDIR}/umsonstdraussen.gpx # look for differences between latin1 and windows-1252 diff --git a/testo.d/gpx.test b/testo.d/gpx.test index 80a356086..f917b2a2e 100644 --- a/testo.d/gpx.test +++ b/testo.d/gpx.test @@ -61,3 +61,65 @@ compare ${REFERENCE}/gdb-sample-v3-ilinks.gpx ${TMPDIR}/gdb-sample-v3-ilinks.gpx # use declared namespace prefixes in gpx reader gpsbabel -t -i gpx -f ${REFERENCE}/track/garminconnect.gpx -o unicsv,utc=0 -F ${TMPDIR}/garminconnect.csv compare ${REFERENCE}/track/garminconnect.csv ${TMPDIR}/garminconnect.csv + +# order of wpt type elements +gpsbabel -i gpx -f ${REFERENCE}/wptsequence.gpx -o gpx -F ${TMPDIR}/wptsequence.gpx +compare ${REFERENCE}/wptsequence.gpx ${TMPDIR}/wptsequence.gpx + +# passthrough +# gpx 1.0 +# we lose any extensions at the end of file - we don't have a place to store them. +gpsbabel -i gpx -f ${REFERENCE}/gpxpassthrough10.gpx -o gpx -F ${TMPDIR}/gpxpassthrough10~gpx.gpx +compare ${REFERENCE}/gpxpassthrough10~gpx.gpx ${TMPDIR}/gpxpassthrough10~gpx.gpx + +# gpx 1.1 +# we lose the any extensions in metadata, but we are constructing metadata anyway +# we lose any extensions at the end of each trkseg - we don't have a place to store them. +# we lose any extensions at the end of file - we don't have a place to store them. +gpsbabel -i gpx -f ${REFERENCE}/gpxpassthrough11.gpx -o gpx -F ${TMPDIR}/gpxpassthrough11~gpx.gpx +compare ${REFERENCE}/gpxpassthrough11~gpx.gpx ${TMPDIR}/gpxpassthrough11~gpx.gpx + +# garmin specific categories +gpsbabel -p gpsbabel-sample.ini -i gpx -f ${REFERENCE}/garmincategories.gpx -o garmin_txt,utc=-7 -F ${TMPDIR}/garmincategories~gpx.txt +compare ${REFERENCE}/garmincategories.txt ${TMPDIR}/garmincategories~gpx.txt + +gpsbabel -p gpsbabel-sample.ini -i garmin_txt,utc=-7 -f ${REFERENCE}/garmincategories.txt -o gpx,garminextensions -F ${TMPDIR}/garmincategories~txt.gpx +compare ${REFERENCE}/garmincategories.gpx ${TMPDIR}/garmincategories~txt.gpx + +if [ -z "${VALGRIND}" ]; then + set -e + if command -v xmllint > /dev/null; + then + GPXS=$(find ${REFERENCE} -name \*.gpx) + mkdir -p ${TMPDIR}/validcheck + for f in $GPXS + do + case $f in + # this isn't a gpx file + ${REFERENCE}/track/trackfilter_discard_err.gpx) + ;; + + *) + tmpf=${TMPDIR}/validcheck/$(basename $f) + gpsbabel -i gpx -f $f -o gpx -F $tmpf + xmllint --schema ${BASEPATH}/tools/schema/gpx/master.xsd --noout $tmpf + ;; + esac; + + case $f in + # this isn't a gpx file + ${REFERENCE}/track/trackfilter_discard_err.gpx) + ;; + + *) + tmpf=${TMPDIR}/validcheck/$(basename $f) + gpsbabel -i gpx -f $f -o gpx,garminextensions -F $tmpf + xmllint --schema ${BASEPATH}/tools/schema/gpx/master.xsd --noout $tmpf + ;; + esac; + done + else + echo "Skipping GPX validation phase." + fi + set +e +fi diff --git a/testo.d/humminbird.test b/testo.d/humminbird.test index 3604bc6bb..eb143863a 100644 --- a/testo.d/humminbird.test +++ b/testo.d/humminbird.test @@ -7,6 +7,21 @@ gpsbabel -i humminbird -f ${REFERENCE}/humminbird.hwr -o humminbird -F ${TMPDIR} bincompare ${REFERENCE}/humminbird.hwr ${TMPDIR}/humminbird.hwr gpsbabel -i humminbird -f ${REFERENCE}/route/humminbird.hwr -o gpx -F ${TMPDIR}/humminbird~hwr.gpx compare ${REFERENCE}/route/humminbird~hwr.gpx ${TMPDIR}/humminbird~hwr.gpx + +# The provenance of humminbird.hwr is unclear. +# The routes have timestamps +# 48 a8 59 72 (Sun Aug 17 2008 17:01:38 GMT+0000) +# 48 a8 5a 77 (Sun Aug 17 2008 17:05:59 GMT+0000) +# 48 a8 5a 80 (Sun Aug 17 2008 17:06:08 GMT+0000) +# which suggests they may be real. +# The unused entries in the points array of the route headers appear to be random. +# To add regresssion for our writer we generated a corresponding hwr file with GPSBABEL_FREEZE_TIME=y +# gpsbabel -i humminbird -f reference/route/humminbird.hwr -o humminbird -F reference/route/humminbird_gpsbabel.hwr +# This has zeroed timestamps and zeroed unused entries in the points arrays. +gpsbabel -i humminbird -f ${REFERENCE}/route/humminbird_gpsbabel.hwr -o humminbird -F ${TMPDIR}/humminbird_gpsbabel~hwr.hwr +compare ${REFERENCE}/route/humminbird_gpsbabel.hwr ${TMPDIR}/humminbird_gpsbabel~hwr.hwr + +# # # Humminbird tracks # @@ -27,3 +42,4 @@ compare ${REFERENCE}/humminbird-rte-v2~gpx.gpx ${TMPDIR}/humminbird-rte-v2~gpx.g gpsbabel -i humminbird -f ${REFERENCE}/humminbird-rte-v3.hwr -o gpx,humminbirdextensions=1 -F ${TMPDIR}/humminbird-rte-v3~gpx.gpx compare ${REFERENCE}/humminbird-rte-v3~gpx.gpx ${TMPDIR}/humminbird-rte-v3~gpx.gpx + diff --git a/testo.d/kml.test b/testo.d/kml.test index 212e3cbea..7e0d6b7a6 100644 --- a/testo.d/kml.test +++ b/testo.d/kml.test @@ -84,7 +84,7 @@ if [ -z "${VALGRIND}" ]; then *) tmpf=${TMPDIR}/validcheck/$(basename $f) gpsbabel -i kml -f $f -o kml -F $tmpf - xmllint --schema ${BASEPATH}/tools/kml22-schema/kml22gx.xsd --noout $tmpf + xmllint --schema ${BASEPATH}/tools/schema/kml/kml22gx.xsd --noout $tmpf esac; done else @@ -100,6 +100,9 @@ gpsbabel -i igc -f ${REFERENCE}/track/92GV66G1.igc -o kml,floating=1,track=1,poi compare ${REFERENCE}/track/92GV66G1.igc.kml ${TMPDIR}/92GV66G1.igc.kml gpsbabel -i igc -f ${REFERENCE}/track/92HV66G1.igc -o kml,floating=1,track=1,points=0 -F ${TMPDIR}/92HV66G1.igc.kml compare ${REFERENCE}/track/92HV66G1.igc.kml ${TMPDIR}/92HV66G1.igc.kml +# Test the inclusion and exclusion of (non)default extensions +gpsbabel -i igc,SIU=1,GFO=1,FXA=0,ENL=0 -f ${REFERENCE}/track/27GLQKF3.igc -o kml,floating=1,track=1,points=0 -F ${TMPDIR}/27GLQKF3.igc.kml +compare ${REFERENCE}/track/27GLQKF3.igc.kml ${TMPDIR}/27GLQKF3.igc.kml # verify kml:dateTimeType parsing gpsbabel -i kml -f ${REFERENCE}/xsddatetime.kml -o unicsv,utc -F ${TMPDIR}/xsddatetime~kml.csv diff --git a/testo.d/lowranceusr.test b/testo.d/lowranceusr.test index e35692ffa..c6592c364 100644 --- a/testo.d/lowranceusr.test +++ b/testo.d/lowranceusr.test @@ -152,3 +152,16 @@ gpsbabel -i lowranceusr -f ${REFERENCE}/lowrance-v6.usr -o unicsv,utc=0 -F ${TMP tail -n +2 ${TMPDIR}/lowrance-v6-unicsv.txt | sed "s/[0-9]*,//" | sort -t , -k 3 > ${TMPDIR}/lowrance-v6-unicsv-sorted.txt compare ${TMPDIR}/lowrance-v4-unicsv-sorted.txt ${TMPDIR}/lowrance-v6-unicsv-sorted.txt +# test translation of version 2, 3 continuous flag to new track segments. +# 1. when reading usr files can we translate the contiuous flag in a usr file to track segments? +gpsbabel -i lowranceusr -f ${REFERENCE}/lowrance-v2.usr -o gpx -F ${TMPDIR}/lowrance-v2.gpx +compare ${REFERENCE}/lowrance-v2.gpx ${TMPDIR}/lowrance-v2.gpx +# 2. if so, when writing a usr file can we translate a track segment to the continuous flag in the usr file? +gpsbabel -i gpx -f ${REFERENCE}/lowrance-v2.gpx -o lowranceusr -F ${TMPDIR}/lowrance-v2~gpx.usr +gpsbabel -i lowranceusr -f ${TMPDIR}/lowrance-v2~gpx.usr -o gpx -F ${TMPDIR}/lowrance-v2~usr.gpx +compare ${REFERENCE}/lowrance-v2.gpx ${TMPDIR}/lowrance-v2~usr.gpx +# 3. can we get the track segments correct when we do a merge? +gpsbabel -i gpx -f ${REFERENCE}/lowrance-v2.gpx -o lowranceusr,merge -F ${TMPDIR}/lowrance-v2-merge~gpx.usr +gpsbabel -i lowranceusr -f ${TMPDIR}/lowrance-v2-merge~gpx.usr -o gpx -F ${TMPDIR}/lowrance-v2-merge~usr.gpx +compare ${REFERENCE}/lowrance-v2-merge~usr.gpx ${TMPDIR}/lowrance-v2-merge~usr.gpx + diff --git a/testo.d/mkshort.test b/testo.d/mkshort.test index 51007a3ff..b48cd14eb 100644 --- a/testo.d/mkshort.test +++ b/testo.d/mkshort.test @@ -11,3 +11,31 @@ ${VALGRIND} "${PNAME}" -s -i unicsv -f ${REFERENCE}/mkshort.csv -o xcsv,style=${ echo "${PNAME} succeeded! (it shouldn't have with this input...)" } compare ${REFERENCE}/mkshort3.log ${TMPDIR}/mkshort3.log + +rm -f ${TMPDIR}/mkshort4.log +# whitespace +echo '0,0," a e "' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=8,snwhite=1 -F - >> ${TMPDIR}/mkshort4.log +# trailing numbers +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=7 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=6 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=5 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=4 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=3 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=2 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd0123"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=1 -F - >>${TMPDIR}/mkshort4.log +# vowels +echo '0,0,"xxaeiouzz"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=9 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"xxaeiouzz"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=8 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"xxaeiouzz"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=7 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"xxaeiouzz"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=6 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"xxaeiouzz"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=5 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"xxaeiouzz"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=4 -F - >>${TMPDIR}/mkshort4.log +#truncation +echo '0,0,"abcd"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=4 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=3 -F - >>${TMPDIR}/mkshort4.log +echo '0,0,"abcd"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=2 -F - >>${TMPDIR}/mkshort4.log +#replacements +echo '0,0,"abcd one"' | gpsbabel -s -i unicsv,fields=lat+long+name -f - -o xcsv,style=reference/mkshort.style,snlen=8 -F - >>${TMPDIR}/mkshort4.log + +compare ${REFERENCE}/mkshort4.log ${TMPDIR}/mkshort4.log + diff --git a/testo.d/ozi.test b/testo.d/ozi.test index 51903441d..1a94e465e 100644 --- a/testo.d/ozi.test +++ b/testo.d/ozi.test @@ -5,6 +5,10 @@ gpsbabel -i ozi -f ${REFERENCE}/ozi.wpt -o ozi -F ${TMPDIR}/oz.wpt gpsbabel -i ozi -f ${TMPDIR}/oz.wpt -o ozi -F ${TMPDIR}/ozi.wpt compare ${TMPDIR}/ozi.wpt ${REFERENCE} +# Same, but with colors set +gpsbabel -i geo -f ${REFERENCE}/geocaching.loc -o ozi,wptfgcolor=#de0000,wptbgcolor=red -F ${TMPDIR}/ozi-color.wpt +compare ${TMPDIR}/ozi-color.wpt ${REFERENCE} + # Test Ozi routes. gpsbabel -i ozi -f ${REFERENCE}/route/ozi.rte -o gpx -F ${TMPDIR}/ozi~gpx.gpx compare ${TMPDIR}/ozi~gpx.gpx ${REFERENCE}/route/ diff --git a/testo.d/simplify-relative.test b/testo.d/simplify-relative.test index cb39a2e7f..3286faa2b 100644 --- a/testo.d/simplify-relative.test +++ b/testo.d/simplify-relative.test @@ -4,3 +4,6 @@ gpsbabel -i gpx -f ${REFERENCE}/track/simplify-relative.gpx -x simplify,relative,count=33 -o gpx -F ${TMPDIR}/simplify-relative2.gpx compare ${REFERENCE}/track/simplify-relative2.gpx ${TMPDIR}/simplify-relative2.gpx +gpsbabel -i gpx -f ${REFERENCE}/track/simplify-relative.gpx -x simplify,relative,error=0.61 -o gpx -F ${TMPDIR}/simplify-relative3.gpx +compare ${REFERENCE}/track/simplify-relative2.gpx ${TMPDIR}/simplify-relative3.gpx + diff --git a/testo.d/simplify.test b/testo.d/simplify.test index 7771702bb..6429f9028 100644 --- a/testo.d/simplify.test +++ b/testo.d/simplify.test @@ -19,7 +19,12 @@ gpsbabel -i gpx -f ${REFERENCE}/track/garmin-edge-800-output.gpx \ compare ${REFERENCE}/simplify_error_crosstrack.gpx ${TMPDIR}/simplify_error.gpx gpsbabel -i gpx -f ${REFERENCE}/track/garmin-edge-800-output.gpx \ - -x simplify,error=1000m,length \ + -x simplify,error=20.34m,length \ -o gpx -F ${TMPDIR}/simplify_error_length.gpx compare ${REFERENCE}/simplify_error_length.gpx ${TMPDIR}/simplify_error_length.gpx +# check default error units are miles +gpsbabel -i gpx -f ${REFERENCE}/track/garmin-edge-800-output.gpx \ + -x simplify,error=0.01263869,length \ + -o gpx -F ${TMPDIR}/simplify_error_length_miles.gpx +compare ${REFERENCE}/simplify_error_length.gpx ${TMPDIR}/simplify_error_length_miles.gpx diff --git a/testo.d/unicsv.test b/testo.d/unicsv.test index 6c31bba94..93a89e341 100644 --- a/testo.d/unicsv.test +++ b/testo.d/unicsv.test @@ -54,3 +54,13 @@ gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=1 -F ${TMPDI compare ${REFERENCE}/pretty_degree1.csv ${TMPDIR}/pretty_degree1.csv gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=2 -F ${TMPDIR}/pretty_degree2.csv compare ${REFERENCE}/pretty_degree2.csv ${TMPDIR}/pretty_degree2.csv + +# delimiter detection +gpsbabel -i unicsv -f ${REFERENCE}/unidelim.csv -o gpx -F ${TMPDIR}/unidelim.gpx +compare ${REFERENCE}/unidelim.gpx ${TMPDIR}/unidelim.gpx + +gpsbabel -i unicsv,utc -f ${REFERENCE}/bngtest.csv -o gpx -F ${TMPDIR}/bngtest~csv.gpx +compare ${REFERENCE}/bngtest.gpx ${TMPDIR}/bngtest~csv.gpx +gpsbabel -i gpx -f ${REFERENCE}/bngtest.gpx -o unicsv,grid=bng,utc -F ${TMPDIR}/bngtest~gpx.csv +compare ${REFERENCE}/bngtest.csv ${TMPDIR}/bngtest~gpx.csv + diff --git a/text.cc b/text.cc index b582abf5e..e288303d4 100644 --- a/text.cc +++ b/text.cc @@ -48,7 +48,7 @@ TextFormat::wr_init(const QString& fname) file_out = new gpsbabel::TextStream; file_out->open(fname, QIODevice::WriteOnly, MYNAME); } - mkshort_handle = mkshort_new_handle(); + mkshort_handle = new MakeShort; } void @@ -59,7 +59,8 @@ TextFormat::wr_deinit() delete file_out; file_out = nullptr; } - mkshort_del_handle(&mkshort_handle); + delete mkshort_handle; + mkshort_handle = nullptr; output_name.clear(); } @@ -67,7 +68,8 @@ void TextFormat::text_disp(const Waypoint* wpt) { int32_t utmz; - double utme, utmn; + double utme; + double utmn; char utmzc; waypoint_count++; @@ -90,7 +92,7 @@ TextFormat::text_disp(const Waypoint* wpt) if (wpt->altitude != unknown_alt) { position += QStringLiteral(" alt:%1").arg((int)((altunits[0]=='f') ? METERS_TO_FEET(wpt->altitude) : wpt->altitude)); } - QString sn = global_opts.synthesize_shortnames ? mkshort_from_wpt(mkshort_handle, wpt) : wpt->shortname; + QString sn = global_opts.synthesize_shortnames ? mkshort_handle->mkshort_from_wpt(wpt) : wpt->shortname; *file_out << sn.leftJustified(16) << " " << position.rightJustified(59) << "\n"; if (wpt->description != wpt->shortname) { @@ -146,7 +148,7 @@ TextFormat::text_disp(const Waypoint* wpt) logpart = curlog->xml_findfirst(u"groundspeak:date"); if (logpart) { - gpsbabel::DateTime logtime = xml_parse_time(logpart->cdata).toLocalTime(); + gpsbabel::DateTime logtime = xml_parse_time(logpart->cdata).toUTC(); *file_out << logtime.toString(u"yyyy-MM-dd") << "\n"; } @@ -196,7 +198,7 @@ TextFormat::write() if (!suppresssep && !split_output) { *file_out << "-----------------------------------------------------------------------------\n"; } - setshort_length(mkshort_handle, 6); + mkshort_handle->set_length(6); auto text_disp_lambda = [this](const Waypoint* waypointp)->void { text_disp(waypointp); }; diff --git a/text.h b/text.h index 3305a92b0..37ad2b97d 100644 --- a/text.h +++ b/text.h @@ -26,6 +26,7 @@ #include "defs.h" #include "format.h" // for Format +#include "mkshort.h" // for MakeShort #include "src/core/textstream.h" // for TextStream @@ -60,7 +61,7 @@ class TextFormat : public Format /* Data Members */ gpsbabel::TextStream* file_out{nullptr}; - short_handle mkshort_handle{}; + MakeShort* mkshort_handle{}; char* suppresssep = nullptr; char* txt_encrypt = nullptr; diff --git a/tools/Dockerfile_f39 b/tools/Dockerfile_f39 new file mode 100644 index 000000000..5d89d175f --- /dev/null +++ b/tools/Dockerfile_f39 @@ -0,0 +1,22 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM fedora:39 + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# basic tools to build +RUN dnf install --assumeyes git make valgrind diffutils findutils langpacks-en ninja-build && \ + dnf clean all +# libraries used by gpsbabel. zlib and shapelib may or may not be used depending qmake options. +RUN dnf install --assumeyes libusb1-devel zlib-devel shapelib-devel && \ + dnf clean all +# Qt used by gpsbabel, gpsbabelfe +RUN dnf install --assumeyes qt5-qtbase-devel qt5-qtserialport-devel qt5-qtwebengine-devel qt5-linguist qt5-qttranslations && \ + dnf clean all +RUN dnf install --assumeyes qt6-qtbase-devel qt6-qtserialport-devel qt6-qtwebengine-devel qt6-linguist qt6-qttranslations qt6-qt5compat-devel qt6-qttools-devel libxkbcommon-devel && \ + dnf clean all +# tools to build the docs +RUN dnf install --assumeyes expat desktop-file-utils libxslt docbook-style-xsl fop docbook5-style-xsl docbook5-schemas && \ + dnf clean all diff --git a/tools/Dockerfile_f40 b/tools/Dockerfile_f40 new file mode 100644 index 000000000..fe9e83448 --- /dev/null +++ b/tools/Dockerfile_f40 @@ -0,0 +1,22 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM fedora:40 + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# basic tools to build +RUN dnf install --assumeyes git make valgrind diffutils findutils langpacks-en ninja-build && \ + dnf clean all +# libraries used by gpsbabel. zlib and shapelib may or may not be used depending qmake options. +RUN dnf install --assumeyes libusb1-devel zlib-devel shapelib-devel && \ + dnf clean all +# Qt used by gpsbabel, gpsbabelfe +RUN dnf install --assumeyes qt5-qtbase-devel qt5-qtserialport-devel qt5-qtwebengine-devel qt5-linguist qt5-qttranslations && \ + dnf clean all +RUN dnf install --assumeyes qt6-qtbase-devel qt6-qtserialport-devel qt6-qtwebengine-devel qt6-linguist qt6-qttranslations qt6-qt5compat-devel qt6-qttools-devel libxkbcommon-devel && \ + dnf clean all +# tools to build the docs +RUN dnf install --assumeyes expat desktop-file-utils libxslt docbook-style-xsl fop docbook5-style-xsl docbook5-schemas && \ + dnf clean all diff --git a/tools/Dockerfile_jammy b/tools/Dockerfile_jammy index 2545c4acb..bd6b75b9b 100644 --- a/tools/Dockerfile_jammy +++ b/tools/Dockerfile_jammy @@ -20,7 +20,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \ g++ \ make \ - autoconf \ git \ valgrind \ expat \ @@ -32,6 +31,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ clang-tidy \ jq \ curl \ + ca-certificates \ && rm -rf /var/lib/apt/lists/* # alternative compiler diff --git a/tools/Dockerfile_qtio b/tools/Dockerfile_noble similarity index 55% rename from tools/Dockerfile_qtio rename to tools/Dockerfile_noble index a06f758e2..a96fa1683 100644 --- a/tools/Dockerfile_qtio +++ b/tools/Dockerfile_noble @@ -1,53 +1,16 @@ # this file is used to build the image gpsbabel_build_environment used by travis. -FROM ubuntu:bionic as qt_install_prep -WORKDIR /app - -# update environment. -ARG DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get install -y --no-install-recommends \ - apt-utils \ - && apt-get upgrade -y \ - && rm -rf /var/lib/apt/lists/* +FROM ubuntu:noble -# install packages needed to install Qt -RUN apt-get update && apt-get install -y --no-install-recommends \ - libdbus-1-3 \ - libfreetype6 \ - libfontconfig1 \ - libx11-6 \ - libx11-xcb1 \ - libxext6 \ - libxkbcommon0 \ - libxkbcommon-x11-0 \ - libxrender1 \ - ca-cacert \ - wget \ - && rm -rf /var/lib/apt/lists/* - -FROM qt_install_prep as qt_install -# basic build and test tools -ARG INSTALLER -ARG QT_CI_PACKAGES -ARG QT_VERSION -COPY ./extract-qt-installer ./qt-install.qs ./$INSTALLER /app/ -RUN ./extract-qt-installer $INSTALLER /opt/Qt \ - && rm ./extract-qt-installer ./qt-install.qs ./$INSTALLER \ - && echo "export PATH=/opt/Qt/$QT_VERSION/gcc_64/bin:$PATH" > /opt/qt-$QT_VERSION.env - -FROM ubuntu:bionic LABEL maintainer="https://github.com/tsteven4" + WORKDIR /app -ARG QT_VERSION # update environment. -# bionic needs a newer git than provided by ubuntu:bionic ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y --no-install-recommends \ apt-utils \ - software-properties-common \ && apt-get upgrade -y \ - && add-apt-repository ppa:git-core/ppa \ && rm -rf /var/lib/apt/lists/* # install packages needed for gpsbabel build @@ -57,7 +20,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \ g++ \ make \ - autoconf \ git \ valgrind \ expat \ @@ -65,6 +27,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ bear \ cmake \ ninja-build \ + clazy \ + clang-tidy \ + jq \ + curl \ + ca-certificates \ && rm -rf /var/lib/apt/lists/* # alternative compiler @@ -77,7 +44,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ fop \ xsltproc \ docbook-xml \ + docbook5-xml \ docbook-xsl \ + docbook-xsl-ns \ + libavalon-framework-java \ + jing \ && rm -rf /var/lib/apt/lists/* # pkgs with libraries needed by gpsbabel @@ -87,21 +58,19 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libudev-dev \ && rm -rf /var/lib/apt/lists/* -# dependencies of Qt +# pkgs with qt used by gpsbabel RUN apt-get update && apt-get install -y --no-install-recommends \ - libglib2.0-0 \ + qt6-base-dev \ + qt6-5compat-dev \ + qt6-serialport-dev \ libx11-xcb-dev \ - libglu1-mesa-dev \ - libasound2 \ - libxcomposite1 \ - libxcursor1 \ + libxkbcommon-dev \ + qt6-tools-dev \ + qt6-translations-l10n \ + qt6-webengine-dev \ + qt6-wayland \ && rm -rf /var/lib/apt/lists/* -# Qt -COPY --from=qt_install /opt/qt-$QT_VERSION.env /opt/qtio.env -COPY --from=qt_install /opt/Qt/$QT_VERSION /opt/Qt/$QT_VERSION -COPY --from=qt_install /opt/Qt/Licenses /opt/Qt/Licenses - # pkgs needed to generate coverage report: RUN apt-get update && apt-get install -y --no-install-recommends \ gcovr \ diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.5.0 b/tools/archive_images/Dockerfile_gpsbabel_1.5.0 new file mode 100644 index 000000000..a9982dc59 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.5.0 @@ -0,0 +1,73 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:focal + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt5-default \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + libqt5webkit5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_5_0.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_5_0 \ + && cd gpsbabel \ + && git apply /home/gpsbabel/gpsbabel_1_5_0.patch \ + && rm -fr zlib \ + && autoconf -f && ./configure --with-zlib=system && make -j 10 linux-gui \ + && ln -s $(pwd)/gui/GPSBabel1.5.0/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabel1.5.0/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.5.1 b/tools/archive_images/Dockerfile_gpsbabel_1.5.1 new file mode 100644 index 000000000..740dcd7e5 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.5.1 @@ -0,0 +1,73 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:focal + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt5-default \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + libqt5webkit5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_5_1.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_5_1 \ + && cd gpsbabel \ + && git apply /home/gpsbabel/gpsbabel_1_5_1.patch \ + && rm -fr zlib \ + && autoconf -f && ./configure --with-zlib=system && make -j 10 linux-gui \ + && ln -s $(pwd)/gui/GPSBabel1.5.1/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabel1.5.1/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.5.2 b/tools/archive_images/Dockerfile_gpsbabel_1.5.2 new file mode 100644 index 000000000..3d568de46 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.5.2 @@ -0,0 +1,75 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:focal + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt5-default \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + libqt5webkit5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_5_2.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_5_2 \ + && cd gpsbabel \ + && git apply /home/gpsbabel/gpsbabel_1_5_2.patch \ + && rm -fr zlib \ + && autoconf -f && ./configure --with-zlib=system && make -j 10 linux-gui \ + && ln -s $(pwd)/gui/GPSBabel1.5.2/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabel1.5.2/gpsbabelfe /usr/local/bin + +#ENTRYPOINT ["/usr/local/bin/gpsbabel"] + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.5.3 b/tools/archive_images/Dockerfile_gpsbabel_1.5.3 new file mode 100644 index 000000000..bd6d2e55f --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.5.3 @@ -0,0 +1,72 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:focal + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt5-default \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + libqt5webkit5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_5_3.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_5_3 \ + && git apply /home/gpsbabel/gpsbabel_1_5_3.patch \ + && rm -fr zlib \ + && autoconf -f && ./configure --with-zlib=system && make -j 10 linux-gui \ + && ln -s $(pwd)/gui/GPSBabel1.5.3/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabel1.5.3/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.5.4 b/tools/archive_images/Dockerfile_gpsbabel_1.5.4 new file mode 100644 index 000000000..5a7960260 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.5.4 @@ -0,0 +1,72 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:focal + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt5-default \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + qtwebengine5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_5_4.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_5_4 \ + && git apply /home/gpsbabel/gpsbabel_1_5_4.patch \ + && rm -fr zlib \ + && autoconf -f && ./configure --with-zlib=system && make -j 10 linux-gui \ + && ln -s $(pwd)/gui/GPSBabel1.5.4/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabel1.5.4/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.6.0 b/tools/archive_images/Dockerfile_gpsbabel_1.6.0 new file mode 100644 index 000000000..57b1c188f --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.6.0 @@ -0,0 +1,73 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:focal + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + patch \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt5-default \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + qtwebengine5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_6_0.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_6_0.1 \ + && patch < /home/gpsbabel/gpsbabel_1_6_0.patch \ + && rm -fr zlib \ + && ./configure --with-zlib=system && make -j 10 linux-gui && make check \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.7.0 b/tools/archive_images/Dockerfile_gpsbabel_1.7.0 new file mode 100644 index 000000000..111de6936 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.7.0 @@ -0,0 +1,73 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:jammy + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + patch \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-1.0-0-dev \ + pkg-config \ + libudev-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qtbase5-dev \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + qtwebengine5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_1_7_0.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_7_0 \ + && patch < /home/gpsbabel/gpsbabel_1_7_0.patch \ + && rm -fr zlib \ + && ./configure --with-zlib=system && make -j 10 linux-gui && make check \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.8.0 b/tools/archive_images/Dockerfile_gpsbabel_1.8.0 new file mode 100644 index 000000000..61095c128 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.8.0 @@ -0,0 +1,72 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:jammy + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + autoconf \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-1.0-0-dev \ + pkg-config \ + libudev-dev \ + libshp-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qtbase5-dev \ + qttools5-dev \ + qttools5-dev-tools \ + qttranslations5-l10n \ + qtwebengine5-dev \ + libqt5serialport5-dev \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_8_0 \ + && rm -fr zlib \ + && rm -fr shapelib \ + && sed -i -e"/GB.SHA/i set(ENV{GITHUB_SHA} \"$(git log -1 --format=%h)\")" gbversion.cmake \ + && qmake WITH_ZLIB=pkgconfig WITH_SHAPELIB=pkgconfig && make -j 10 unix-gui && make check \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_1.9.0 b/tools/archive_images/Dockerfile_gpsbabel_1.9.0 new file mode 100644 index 000000000..54bc4cbfa --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_1.9.0 @@ -0,0 +1,86 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:jammy + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-1.0-0-dev \ + pkg-config \ + libudev-dev \ + libshp-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt6-base-dev \ + libqt6core5compat6-dev \ + libqt6opengl6-dev \ + libqt6serialport6-dev \ + libqt6webenginecore6-bin \ + libgl-dev \ + libopengl-dev \ + libvulkan-dev \ + libx11-xcb-dev \ + libxkbcommon-dev \ + qt6-l10n-tools \ + qt6-tools-dev \ + qt6-tools-dev-tools \ + qt6-translations-l10n \ + qt6-webengine-dev \ + qt6-webengine-dev-tools \ + qt6-wayland \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + tzdata \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git checkout gpsbabel_1_9_0 \ + && rm -fr zlib \ + && rm -fr shapelib \ + && sed -i -e"/GB.SHA/i set(ENV{GITHUB_SHA} \"$(git log -1 --format=%h)\")" gbversion.cmake \ + && mkdir bld \ + && cd bld \ + && cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/cmake/Qt6 -DGPSBABEL_WITH_ZLIB=pkgconfig -DGPSBABEL_WITH_SHAPELIB=pkgconfig .. \ + && cmake --build . --target package_app \ + && cmake --build . --target check \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/Dockerfile_gpsbabel_dev b/tools/archive_images/Dockerfile_gpsbabel_dev new file mode 100644 index 000000000..7a14fb029 --- /dev/null +++ b/tools/archive_images/Dockerfile_gpsbabel_dev @@ -0,0 +1,81 @@ +# this file is used to build the image gpsbabel_build_environment used by travis. + +FROM ubuntu:noble + +LABEL maintainer="https://github.com/tsteven4" + +WORKDIR /app + +# update environment. +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + && apt-get upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +# install packages needed for gpsbabel build +# split into multiple commands to limit layer size + +# basic build and test tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + git \ + expat \ + libxml2-utils \ + cmake \ + ninja-build \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with libraries needed by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + libusb-1.0-0-dev \ + pkg-config \ + libudev-dev \ + libshp-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# pkgs with qt used by gpsbabel +RUN apt-get update && apt-get install -y --no-install-recommends \ + qt6-base-dev \ + qt6-5compat-dev \ + qt6-serialport-dev \ + libx11-xcb-dev \ + libxkbcommon-dev \ + qt6-tools-dev \ + qt6-translations-l10n \ + qt6-webengine-dev \ + qt6-wayland \ + && rm -rf /var/lib/apt/lists/* + +# install environment for locale test +RUN apt-get update && apt-get install -y --no-install-recommends \ + locales \ + tzdata \ + && rm -rf /var/lib/apt/lists/* \ + && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ + && locale-gen \ + && locale -a + +WORKDIR /home/gpsbabel + +COPY gpsbabel_dev.patch /home/gpsbabel + +RUN git clone https://github.com/GPSBabel/gpsbabel.git gpsbabel-build\ + && cd gpsbabel-build \ + && git apply /home/gpsbabel/gpsbabel_dev.patch \ + && rm -fr zlib \ + && rm -fr shapelib \ + && rm -f testo.d/serialization.test \ + && sed -i -e"/GB.SHA/i set(ENV{GITHUB_SHA} \"$(git log -1 --format=%h)\")" gbversion.cmake \ + && mkdir bld \ + && cd bld \ + && cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/cmake/Qt6 -DGPSBABEL_WITH_ZLIB=pkgconfig -DGPSBABEL_WITH_SHAPELIB=pkgconfig -DGB.PACKAGE_RELEASE="+$(git log -1 --format=%h)" .. \ + && cmake --build . --target package_app \ + && cmake --build . --target check \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabel /usr/local/bin \ + && ln -s $(pwd)/gui/GPSBabelFE/gpsbabelfe /usr/local/bin + +COPY setup_user.sh /usr/local/bin diff --git a/tools/archive_images/gpsbabel_1_5_0.patch b/tools/archive_images/gpsbabel_1_5_0.patch new file mode 100644 index 000000000..9166b48de --- /dev/null +++ b/tools/archive_images/gpsbabel_1_5_0.patch @@ -0,0 +1,1089 @@ +diff --git a/gpsbabel/Makefile.in b/gpsbabel/Makefile.in +index f9f7cf66..877c8dd3 100644 +--- a/gpsbabel/Makefile.in ++++ b/gpsbabel/Makefile.in +@@ -426,30 +426,30 @@ cov-upload: FORCE + cov-upload + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++alan.o: alan.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++an1.o: an1.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h an1sym.h +-arcdist.o: arcdist.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++arcdist.o: arcdist.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bcr.o: bcr.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_tables.h +-bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bend.o: bend.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h +-bushnell.o: bushnell.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++bushnell.o: bushnell.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cet.o: cet.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++cet_util.o: cet_util.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + cet/ansi_x3_4_1968.h cet/iso_8859_1.h cet/iso_8859_8.h \ + cet/iso_8859_15.h cet/cp1252.h cet/cp1255.h cet/iso_8859_2.h \ +@@ -461,67 +461,67 @@ cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + cet/iso_8859_13.h cet/iso_8859_14.h cet/iso_8859_3.h cet/iso_8859_4.h \ + cet/iso_8859_5.h cet/iso_8859_6.h cet/iso_8859_7.h cet/iso_8859_9.h \ + cet/koi8_r.h cet/koi8_ru.h cet/koi_8.h +-compegps.o: compegps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++compegps.o: compegps.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cst.o: cst.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h strptime.h +-csv_util.o: csv_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++csv_util.o: csv_util.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h grtcirc.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h xcsv_tokens.gperf +-delbin.o: delbin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delbin.o: delbin.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h +-delgpl.o: delgpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delgpl.o: delgpl.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-destinator.o: destinator.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++destinator.o: destinator.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h strptime.h +-dg-100.o: dg-100.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dg-100.o: dg-100.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h +-discard.o: discard.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++discard.o: discard.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-dmtlog.o: dmtlog.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dmtlog.o: dmtlog.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++duplicate.o: duplicate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-easygps.o: easygps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++easygps.o: easygps.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-enigma.o: enigma.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++enigma.o: enigma.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++exif.o: exif.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h explorist_ini.h +-fatal.o: fatal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++fatal.o: fatal.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-filter_vecs.o: filter_vecs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h gbversion.h +-formspec.o: formspec.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++formspec.o: formspec.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-g7towin.o: g7towin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++g7towin.o: g7towin.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin.o: garmin.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ +@@ -529,165 +529,165 @@ garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h garmin_fs.h garmin_device_xml.h + garmin_device_xml.o: garmin_device_xml.cc defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h garmin_device_xml.h +-garmin_fit.o: garmin_fit.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-garmin_fs.o: garmin_fs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_fs.o: garmin_fs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsmath.h jeeps/gpsport.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_gpi.h + garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsmath.h jeeps/gpsport.h +-garmin_txt.o: garmin_txt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h grtcirc.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-gbfile.o: gbfile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbfile.o: gbfile.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-gbser.o: gbser.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbser.o: gbser.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h gbser_private.h + gbsleep.o: gbsleep.cc config.h +-gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gdb.o: gdb.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h grtcirc.h +-geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++geo.o: geo.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/file.h +-ggv_log.o: ggv_log.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_log.o: ggv_log.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++globals.o: globals.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbversion.h +-glogbook.o: glogbook.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++glogbook.o: glogbook.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h src/core/file.h +-gnav_trl.o: gnav_trl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-google.o: google.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++google.o: google.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-googledir.o: googledir.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++googledir.o: googledir.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gopal.o: gopal.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-gpssim.o: gpssim.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpssim.o: gpssim.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-gpsutil.o: gpsutil.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpsutil.o: gpsutil.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + magellan.h +-gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gpx.o: gpx.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h src/core/file.h \ + src/core/xmlstreamwriter.h src/core/xmltag.h +-grtcirc.o: grtcirc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++grtcirc.o: grtcirc.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gtm.o: gtm.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-height.o: height.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++height.o: height.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h height.h + hiketech.o: hiketech.cc src/core/xmlstreamwriter.h defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h xmlgeneric.h +-holux.o: holux.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++holux.o: holux.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + holux.h +-html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++html.o: html.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++humminbird.o: humminbird.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igc.o: igc.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-ignrando.o: ignrando.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ignrando.o: ignrando.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igo8.o: igo8.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ik3d.o: ik3d.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++inifile.o: inifile.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-internal_styles.o: internal_styles.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++internal_styles.o: internal_styles.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-interpolate.o: interpolate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++interpolate.o: interpolate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h grtcirc.h +-itracku.o: itracku.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++itracku.o: itracku.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ +@@ -695,7 +695,7 @@ jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h \ + jeeps/gpsusbcommon.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ +- jeeps/gps.h jeeps/../defs.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ jeeps/gps.h jeeps/../defs.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ +@@ -703,93 +703,93 @@ jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ + jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h \ + jeeps/gpsusbcommon.h jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h jeeps/../gbser.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-jogmap.o: jogmap.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++jogmap.o: jogmap.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++jtr.o: jtr.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h +-kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++kml.o: kml.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + grtcirc.h src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h +-lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++lmx.o: lmx.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++lowranceusr.o: lowranceusr.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h + mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ + mac/libusb/usb.h mac/libusb/error.h +@@ -799,271 +799,243 @@ mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ + mac/libusb/error.h + mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ + mac/libusb/error.h +-maggeo.o: maggeo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++maggeo.o: maggeo.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h xmlgeneric.h magellan.h +-magproto.o: magproto.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++magproto.o: magproto.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + magellan.h gbser.h explorist_ini.h +-main.o: main.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++main.o: main.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h filterdefs.h \ + csv_util.h +-mapasia.o: mapasia.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapasia.o: mapasia.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-mapbar_track.o: mapbar_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-mapsend.o: mapsend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapsend.o: mapsend.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + mapsend.h magellan.h +-mapsource.o: mapsource.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mapsource.o: mapsource.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-mkshort.o: mkshort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mkshort.o: mkshort.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++mmo.o: mmo.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-mtk_locus.o: mtk_locus.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h +-navicache.o: navicache.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++navicache.o: navicache.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++naviguide.o: naviguide.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navilink.o: navilink.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navitel.o: navitel.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-netstumbler.o: netstumbler.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++netstumbler.o: netstumbler.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h +-nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmea.o: nmea.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h gbser.h \ + strptime.h jeeps/gpsmath.h jeeps/gpsport.h +-nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmn4.o: nmn4.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h +-nukedata.o: nukedata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++nukedata.o: nukedata.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++osm.o: osm.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ozi.o: ozi.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-parse.o: parse.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++parse.o: parse.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h strptime.h +-pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++pcx.o: pcx.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h csv_util.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h +-polygon.o: polygon.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++polygon.o: polygon.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-position.o: position.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++position.o: position.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-psitrex.o: psitrex.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++psitrex.o: psitrex.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h + queue.o: queue.cc queue.h +-radius.o: radius.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++radius.o: radius.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-random.o: random.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++random.o: random.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-raymarine.o: raymarine.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++raymarine.o: raymarine.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++reverse_route.o: reverse_route.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-rgbcolors.o: rgbcolors.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-route.o: route.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++route.o: route.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-saroute.o: saroute.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++saroute.o: saroute.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbn.o: sbn.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h navilink.h +-sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbp.o: sbp.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h navilink.h +-session.o: session.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++session.o: session.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-shape.o: shape.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++shape.o: shape.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skyforce.o: skyforce.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-skytraq.o: skytraq.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skytraq.o: skytraq.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h +-smplrout.o: smplrout.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++smplrout.o: smplrout.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sort.o: sort.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h filterdefs.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++stackfilter.o: stackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-stmsdf.o: stmsdf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmsdf.o: stmsdf.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-stmwpp.o: stmwpp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmwpp.o: stmwpp.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++subrip.o: subrip.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-swapdata.o: swapdata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++swapdata.o: swapdata.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-tef_xml.o: tef_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tef_xml.o: tef_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++teletype.o: teletype.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++text.o: text.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tiger.o: tiger.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-tmpro.o: tmpro.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tmpro.o: tmpro.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-tomtom.o: tomtom.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tomtom.o: tomtom.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpg.o: tpg.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpo.o: tpo.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++trackfilter.o: trackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h strptime.h grtcirc.h xmlgeneric.h +-transform.o: transform.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++transform.o: transform.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-unicsv.o: unicsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++unicsv.o: unicsv.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-units.o: units.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++units.o: units.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++util.o: util.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h jeeps/gpsmath.h jeeps/gpsport.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++v900.o: v900.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-validate.o: validate.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++validate.o: validate.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vcf.o: vcf.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vecs.o: vecs.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + gbversion.h +-vidaone.o: vidaone.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vidaone.o: vidaone.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-vitosmt.o: vitosmt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitosmt.o: vitosmt.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitovtt.o: vitovtt.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vpl.o: vpl.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-waypt.o: waypt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++waypt.o: waypt.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-wbt-200.o: wbt-200.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wbt-200.o: wbt-200.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-xcsv.o: xcsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xcsv.o: xcsv.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h + xhtmlent.o: xhtmlent.cc +-xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h src/core/file.h +-xmltag.o: xmltag.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++xmltag.o: xmltag.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h +-xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xol.o: xol.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-yahoo.o: yahoo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++yahoo.o: yahoo.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) +diff --git a/gpsbabel/configure.in b/gpsbabel/configure.in +index db98f6db..567ac1f1 100644 +--- a/gpsbabel/configure.in ++++ b/gpsbabel/configure.in +@@ -55,6 +55,7 @@ AC_ARG_WITH(cet,[ --with-cet=(default,all,minimal)], + + if test $GCC = yes; then + CFLAGS="$CFLAGS -Wall" ++ CXXFLAGS="$CXXFLAGS -Wall" + fi + + if test "$cet" = "all"; then +@@ -156,15 +157,21 @@ AC_SUBST(RC) + # On RHEL/OEL/SL/CENTOS/FEDORA qmake is from Qt3, and qmake-qt4 is from Qt4. + # If qmake-qt4 isn't found look for the standard name qmake and assume it is + # from a useful version Qt. +-AC_CHECK_TOOLS(QMAKE, [qmake-qt4 qmake], "no") +-AC_CHECK_PROGS(LUPDATE, [lupdate-qt4 lupdate]) +-AC_CHECK_PROGS(LRELEASE, [lrelease-qt4 lrelease]) ++AC_CHECK_TOOLS(QMAKE, [qmake-qt5 qmake-qt4 qmake], "no") ++AC_CHECK_TOOLS(LUPDATE, [lupdate-qt5 lupdate-qt4 lupdate]) ++AC_CHECK_TOOLS(LRELEASE, [lrelease-qt5 lrelease-qt4 lrelease]) + + if test "$QMAKE" = no ; then +- AC_MSG_ERROR([Qt4 is required, but not found]); ++ AC_MSG_ERROR([Qt4 or Qt5 is required, but neither was found]); + fi + +-QT_LIBS="-L$($QMAKE -query QT_INSTALL_LIBS) -l QtCore" ++# guess the name of the Qt Core library. ++QT_LIBVER=$($QMAKE -query -query QT_VERSION | sed -e 's/\..*//') ++if test "$QT_LIBVER" -ge 5 ; then ++ QT_LIBS="-L$($QMAKE -query QT_INSTALL_LIBS) -lQt${QT_LIBVER}Core" ++else ++ QT_LIBS="-L$($QMAKE -query QT_INSTALL_LIBS) -lQtCore" ++fi + QT_INC=$($QMAKE -query QT_INSTALL_HEADERS) + QT_INC_OPT="-I" + QT_SYSINC_OPT="-isystem" +@@ -222,6 +229,28 @@ case "$target" in + QT_INC_OPT="-F" + QT_SYSINC_OPT="-iframework" + ;; ++ *-*-freebsd*) ++ GBSER=gbser_posix.o ++ AC_MSG_CHECKING(for libusb) ++ if test "$with_libusb" = no ; then ++ AC_MSG_RESULT(check not done) ++ OSJEEPS=jeeps/gpsusbstub.o ++ else ++ OLDFLAGS=$LDFLAGS ++ OCFLAGS=$CFLAGS ++ LDFLAGS="$LDFLAGS -lusb" ++ CFLAGS="$OCFLAGS" ++ ++ AC_CHECK_LIB([usb], [usb_interrupt_read], ++ AC_DEFINE(HAVE_LIBUSB, 1, [Defined if you have libusb]) ++ [USB_CFLAGS=""] ++ [USB_LIBS="-lusb"] ++# ,[AC_MSG_ERROR([libusb is needed])] ++ ) ++ OSJEEPS=jeeps/gpslibusb.o ++ CFLAGS="$OCFLAGS" ++ fi ++ ;; + *) + GBSER=gbser_posix.o + AC_MSG_CHECKING(for libusb) +@@ -283,6 +312,34 @@ case "$target" in + ;; + esac + ++case "$target" in ++ *-*-darwin*) ++ ;; ++ *) ++ AC_MSG_CHECKING(for reduce relocations) ++ OCPPFLAGS="$CPPFLAGS" ++ CPPFLAGS="$CPPFLAGS -I$QT_INC" ++ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ++ #include ++ void f(void) { ++ }])], ++ [AC_MSG_RESULT(no)], ++ [OCXXFLAGS="$CXXFLAGS" ++ CXXFLAGS="$CXXFLAGS -fPIC" ++ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ++ #include ++ void f(void) { ++ }])], ++ [AC_MSG_RESULT(yes) ++ CFLAGS="$CFLAGS -fPIC"], ++ [AC_MSG_RESULT(unknown) ++ CXXFLAGS="$OCXXFLAGS"] ++ )] ++ ) ++ CPPFLAGS="$OCPPFLAGS" ++ ;; ++esac ++ + AC_MSG_CHECKING(for random stuff to make you feel better) + AC_MSG_RESULT(failed) + +@@ -386,7 +443,7 @@ AC_SUBST(QT_INC_OPT) + AC_SUBST(QT_SYSINC_OPT) + AC_SUBST(QT_LIBS) + +-AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile zlib/empty]) ++AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile]) + AC_CONFIG_FILES([gui/makelinuxdist.sh], [chmod +x gui/makelinuxdist.sh]) + AC_OUTPUT + +diff --git a/gpsbabel/gbfile.cc b/gpsbabel/gbfile.cc +index 1b5d3f54..8134e074 100644 +--- a/gpsbabel/gbfile.cc ++++ b/gpsbabel/gbfile.cc +@@ -21,7 +21,6 @@ + */ + + #include "defs.h" +-#include "zlib/zconf.h" + #include "gbfile.h" + + #include +diff --git a/gpsbabel/gui/makelinuxdist.sh.in b/gpsbabel/gui/makelinuxdist.sh.in +index 72707f7a..8176d457 100644 +--- a/gpsbabel/gui/makelinuxdist.sh.in ++++ b/gpsbabel/gui/makelinuxdist.sh.in +@@ -7,32 +7,9 @@ DISTNAME=GPSBabel@PACKAGE_VERSION@@PACKAGE_RELEASE@ + DISTDIR=$DISTNAME + rm -rf $DISTDIR + mkdir $DISTDIR +-mkdir $DISTDIR/plugins + mkdir $DISTDIR/translations + mkdir $DISTDIR/help + +-QT_LIBS=`ldd objects/gpsbabelfe-bin | grep libQt | awk '{print $3}'` +-for lib in $QT_LIBS +-do +- cp $lib $DISTDIR +-done +-#cp `ldd objects/gpsbabelfe-bin | grep libphonon |awk '{print $3}'` $DISTDIR +-#cp `ldd objects/gpsbabelfe-bin | grep libaudio |awk '{print $3}'` $DISTDIR +- +-cp -r $QT_INSTALL_PLUGINS/imageformats $DISTDIR/plugins +-if [ -e $QT_INSTALL_PLUGINS/codecs ] +-then +- cp -r $QT_INSTALL_PLUGINS/codecs $DISTDIR/plugins +-else +- echo "Warning: $QT_INSTALL_PLUGINS/codecs not found, perhaps this is normal for Qt5" +-fi +-if [ -e $QT_INSTALL_PLUGINS/platforms ] +-then +-# we need at least platforms/libqxcb.so +- cp -r $QT_INSTALL_PLUGINS/platforms $DISTDIR/plugins +-else +- echo "Wanring: $QT_INSTALL_PLUGINS/platforms not found, this is normal for Qt4" +-fi + cp $QT_INSTALL_TRANSLATIONS/qt_*.qm $DISTDIR/translations/ + + # copy the compiled translations +@@ -40,10 +17,7 @@ cp *.qm $DISTDIR/translations + + # Now our gui + cp gmapbase.html $DISTDIR/ +-cp gpsbabelfe $DISTDIR/ +-chmod +x $DISTDIR/gpsbabelfe +-cp objects/gpsbabelfe-bin $DISTDIR +-cp qt.conf $DISTDIR/ ++cp objects/gpsbabelfe-bin $DISTDIR/gpsbabelfe + cp ../gpsbabel $DISTDIR/ + # + cp -r help/*.html $DISTDIR/help +@@ -53,7 +27,3 @@ cp ../COPYING $DISTDIR/ + cp ../README* $DISTDIR/ + + +-rm -f $DISTDIR.tar $DISTDIR.tar.bz2 +-tar cvf $DISTDIR.tar $DISTDIR +-bzip2 $DISTDIR.tar +- +diff --git a/gpsbabel/tef_xml.cc b/gpsbabel/tef_xml.cc +index c8a64f8d..134eaa17 100644 +--- a/gpsbabel/tef_xml.cc ++++ b/gpsbabel/tef_xml.cc +@@ -72,11 +72,11 @@ tef_start(xg_string args, const QXmlStreamAttributes* attrv) + bool valid = false; + + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Comment", Qt::CaseInsensitive) == 0) { +- if (attr.value().compare("TourExchangeFormat", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Comment"), Qt::CaseInsensitive) == 0) { ++ if (attr.value().compare(QLatin1String("TourExchangeFormat"), Qt::CaseInsensitive) == 0) { + valid = true; + } +- } else if (attr.name().compare("Version", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Version"), Qt::CaseInsensitive) == 0) { + version = attr.value().toString().toDouble(); + } + } +@@ -95,9 +95,9 @@ tef_header(xg_string args, const QXmlStreamAttributes* attrv) + { + route = route_head_alloc(); + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Name", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Name"), Qt::CaseInsensitive) == 0) { + route->rte_name = attr.value().toString().trimmed(); +- } else if (attr.name().compare("Software", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Software"), Qt::CaseInsensitive) == 0) { + route->rte_desc = attr.value().toString().trimmed(); + } + } +@@ -248,20 +248,20 @@ tef_item_start(xg_string args, const QXmlStreamAttributes* attrv) + QString attrstr = attr.value().toString(); + QByteArray attrtext = attrstr.toUtf8(); + +- if (attr.name().compare("SegDescription", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("SegDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->shortname = attrstr.trimmed(); +- } else if (attr.name().compare("PointDescription", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("PointDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("ViaStation", Qt::CaseInsensitive) == 0 && +- attr.value().compare("true", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("ViaStation"), Qt::CaseInsensitive) == 0 && ++ attr.value().compare(QLatin1String("true"), Qt::CaseInsensitive) == 0) { + wpt_tmp->wpt_flags.fmt_use = 1; /* only a flag */ + + /* new in TEF V2 */ +- } else if (attr.name().compare("Instruction", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Instruction"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("Altitude", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Altitude"), Qt::CaseInsensitive) == 0) { + wpt_tmp->altitude = attrstr.toDouble(); +- } else if (attr.name().compare("TimeStamp", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("TimeStamp"), Qt::CaseInsensitive) == 0) { + /* nothing for the moment */ + } + } diff --git a/tools/archive_images/gpsbabel_1_5_1.patch b/tools/archive_images/gpsbabel_1_5_1.patch new file mode 100644 index 000000000..64c9c6b64 --- /dev/null +++ b/tools/archive_images/gpsbabel_1_5_1.patch @@ -0,0 +1,1077 @@ +diff --git a/gpsbabel/Makefile.in b/gpsbabel/Makefile.in +index fab6dd8d..2e13bef1 100644 +--- a/gpsbabel/Makefile.in ++++ b/gpsbabel/Makefile.in +@@ -419,30 +419,30 @@ cov-upload: FORCE + cov-upload + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++alan.o: alan.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++an1.o: an1.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h an1sym.h +-arcdist.o: arcdist.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++arcdist.o: arcdist.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bcr.o: bcr.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_tables.h +-bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bend.o: bend.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h +-bushnell.o: bushnell.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++bushnell.o: bushnell.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cet.o: cet.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++cet_util.o: cet_util.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + cet/ansi_x3_4_1968.h cet/iso_8859_1.h cet/iso_8859_8.h \ + cet/iso_8859_15.h cet/cp1252.h cet/cp1255.h cet/iso_8859_2.h \ +@@ -454,67 +454,67 @@ cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + cet/iso_8859_13.h cet/iso_8859_14.h cet/iso_8859_3.h cet/iso_8859_4.h \ + cet/iso_8859_5.h cet/iso_8859_6.h cet/iso_8859_7.h cet/iso_8859_9.h \ + cet/koi8_r.h cet/koi8_ru.h cet/koi_8.h +-compegps.o: compegps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++compegps.o: compegps.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cst.o: cst.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h strptime.h +-csv_util.o: csv_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++csv_util.o: csv_util.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h grtcirc.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h xcsv_tokens.gperf +-delbin.o: delbin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delbin.o: delbin.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h +-delgpl.o: delgpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delgpl.o: delgpl.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-destinator.o: destinator.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++destinator.o: destinator.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h strptime.h +-dg-100.o: dg-100.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dg-100.o: dg-100.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h +-discard.o: discard.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++discard.o: discard.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-dmtlog.o: dmtlog.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dmtlog.o: dmtlog.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++duplicate.o: duplicate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-easygps.o: easygps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++easygps.o: easygps.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-enigma.o: enigma.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++enigma.o: enigma.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++exif.o: exif.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h explorist_ini.h +-fatal.o: fatal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++fatal.o: fatal.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-filter_vecs.o: filter_vecs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h gbversion.h +-formspec.o: formspec.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++formspec.o: formspec.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-g7towin.o: g7towin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++g7towin.o: g7towin.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin.o: garmin.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ +@@ -522,165 +522,165 @@ garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h garmin_fs.h garmin_device_xml.h + garmin_device_xml.o: garmin_device_xml.cc defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h garmin_device_xml.h +-garmin_fit.o: garmin_fit.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-garmin_fs.o: garmin_fs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_fs.o: garmin_fs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsmath.h jeeps/gpsport.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_gpi.h + garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsmath.h jeeps/gpsport.h +-garmin_txt.o: garmin_txt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h grtcirc.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-gbfile.o: gbfile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbfile.o: gbfile.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-gbser.o: gbser.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbser.o: gbser.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h gbser_private.h + gbsleep.o: gbsleep.cc config.h +-gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gdb.o: gdb.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h grtcirc.h +-geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++geo.o: geo.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/file.h +-ggv_log.o: ggv_log.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_log.o: ggv_log.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++globals.o: globals.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbversion.h +-glogbook.o: glogbook.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++glogbook.o: glogbook.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h src/core/file.h +-gnav_trl.o: gnav_trl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-google.o: google.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++google.o: google.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-googledir.o: googledir.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++googledir.o: googledir.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gopal.o: gopal.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-gpssim.o: gpssim.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpssim.o: gpssim.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-gpsutil.o: gpsutil.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpsutil.o: gpsutil.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + magellan.h +-gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gpx.o: gpx.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h src/core/file.h \ + src/core/xmlstreamwriter.h src/core/xmltag.h +-grtcirc.o: grtcirc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++grtcirc.o: grtcirc.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gtm.o: gtm.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-height.o: height.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++height.o: height.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h height.h + hiketech.o: hiketech.cc src/core/xmlstreamwriter.h defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h xmlgeneric.h +-holux.o: holux.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++holux.o: holux.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + holux.h +-html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++html.o: html.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++humminbird.o: humminbird.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igc.o: igc.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-ignrando.o: ignrando.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ignrando.o: ignrando.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igo8.o: igo8.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ik3d.o: ik3d.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++inifile.o: inifile.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-internal_styles.o: internal_styles.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++internal_styles.o: internal_styles.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-interpolate.o: interpolate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++interpolate.o: interpolate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h grtcirc.h +-itracku.o: itracku.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++itracku.o: itracku.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ +@@ -688,7 +688,7 @@ jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h \ + jeeps/gpsusbcommon.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ +- jeeps/gps.h jeeps/../defs.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ jeeps/gps.h jeeps/../defs.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ +@@ -696,93 +696,93 @@ jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ + jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h \ + jeeps/gpsusbcommon.h jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h jeeps/../gbser.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h \ ++ config.h queue.h gbfile.h cet.h cet_util.h \ + inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h \ ++ queue.h gbfile.h cet.h cet_util.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-jogmap.o: jogmap.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++jogmap.o: jogmap.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++jtr.o: jtr.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h +-kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++kml.o: kml.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + grtcirc.h src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h +-lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++lmx.o: lmx.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++lowranceusr.o: lowranceusr.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h + mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ + mac/libusb/usb.h mac/libusb/error.h +@@ -792,271 +792,243 @@ mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ + mac/libusb/error.h + mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ + mac/libusb/error.h +-maggeo.o: maggeo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++maggeo.o: maggeo.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h xmlgeneric.h magellan.h +-magproto.o: magproto.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++magproto.o: magproto.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + magellan.h gbser.h explorist_ini.h +-main.o: main.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++main.o: main.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h filterdefs.h \ + csv_util.h +-mapasia.o: mapasia.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapasia.o: mapasia.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-mapbar_track.o: mapbar_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-mapsend.o: mapsend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapsend.o: mapsend.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + mapsend.h magellan.h +-mapsource.o: mapsource.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mapsource.o: mapsource.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-mkshort.o: mkshort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mkshort.o: mkshort.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++mmo.o: mmo.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-mtk_locus.o: mtk_locus.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h gbser.h +-navicache.o: navicache.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++navicache.o: navicache.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++naviguide.o: naviguide.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navilink.o: navilink.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navitel.o: navitel.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-netstumbler.o: netstumbler.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++netstumbler.o: netstumbler.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h +-nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmea.o: nmea.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h gbser.h \ + strptime.h jeeps/gpsmath.h jeeps/gpsport.h +-nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmn4.o: nmn4.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h +-nukedata.o: nukedata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++nukedata.o: nukedata.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++osm.o: osm.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ozi.o: ozi.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-parse.o: parse.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++parse.o: parse.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h strptime.h +-pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++pcx.o: pcx.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h csv_util.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h +-polygon.o: polygon.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++polygon.o: polygon.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-position.o: position.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++position.o: position.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-psitrex.o: psitrex.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++psitrex.o: psitrex.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h + queue.o: queue.cc queue.h +-radius.o: radius.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++radius.o: radius.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-random.o: random.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++random.o: random.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-raymarine.o: raymarine.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++raymarine.o: raymarine.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++reverse_route.o: reverse_route.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-rgbcolors.o: rgbcolors.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-route.o: route.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++route.o: route.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-saroute.o: saroute.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++saroute.o: saroute.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbn.o: sbn.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h navilink.h +-sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbp.o: sbp.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h navilink.h +-session.o: session.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++session.o: session.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-shape.o: shape.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++shape.o: shape.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skyforce.o: skyforce.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-skytraq.o: skytraq.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skytraq.o: skytraq.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h +-smplrout.o: smplrout.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++smplrout.o: smplrout.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sort.o: sort.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h filterdefs.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++stackfilter.o: stackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-stmsdf.o: stmsdf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmsdf.o: stmsdf.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-stmwpp.o: stmwpp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmwpp.o: stmwpp.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++subrip.o: subrip.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-swapdata.o: swapdata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++swapdata.o: swapdata.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-tef_xml.o: tef_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tef_xml.o: tef_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++teletype.o: teletype.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++text.o: text.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tiger.o: tiger.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-tmpro.o: tmpro.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tmpro.o: tmpro.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-tomtom.o: tomtom.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tomtom.o: tomtom.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpg.o: tpg.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpo.o: tpo.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++trackfilter.o: trackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h strptime.h grtcirc.h xmlgeneric.h +-transform.o: transform.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++transform.o: transform.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h filterdefs.h +-unicsv.o: unicsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++unicsv.o: unicsv.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-units.o: units.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++units.o: units.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++util.o: util.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h jeeps/gpsmath.h jeeps/gpsport.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++v900.o: v900.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-validate.o: validate.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++validate.o: validate.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vcf.o: vcf.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vecs.o: vecs.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + gbversion.h +-vidaone.o: vidaone.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vidaone.o: vidaone.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-vitosmt.o: vitosmt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitosmt.o: vitosmt.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitovtt.o: vitovtt.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h +-vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vpl.o: vpl.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h +-waypt.o: waypt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++waypt.o: waypt.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + grtcirc.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-wbt-200.o: wbt-200.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wbt-200.o: wbt-200.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + gbser.h grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h +-xcsv.o: xcsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xcsv.o: xcsv.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h + xhtmlent.o: xhtmlent.cc +-xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h session.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h \ ++ gbfile.h cet.h cet_util.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h src/core/file.h +-xmltag.o: xmltag.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++xmltag.o: xmltag.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h +-xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xol.o: xol.cc defs.h config.h queue.h gbfile.h \ + cet.h cet_util.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-yahoo.o: yahoo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++yahoo.o: yahoo.cc defs.h config.h queue.h \ + gbfile.h cet.h cet_util.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) +diff --git a/gpsbabel/configure.in b/gpsbabel/configure.in +index 44b4c93b..bd622313 100644 +--- a/gpsbabel/configure.in ++++ b/gpsbabel/configure.in +@@ -55,6 +55,7 @@ AC_ARG_WITH(cet,[ --with-cet=(default,all,minimal)], + + if test $GCC = yes; then + CFLAGS="$CFLAGS -Wall" ++ CXXFLAGS="$CXXFLAGS -Wall" + fi + + if test "$cet" = "all"; then +@@ -156,15 +157,21 @@ AC_SUBST(RC) + # On RHEL/OEL/SL/CENTOS/FEDORA qmake is from Qt3, and qmake-qt4 is from Qt4. + # If qmake-qt4 isn't found look for the standard name qmake and assume it is + # from a useful version Qt. +-AC_CHECK_TOOLS(QMAKE, [qmake-qt4 qmake], "no") +-AC_CHECK_PROGS(LUPDATE, [lupdate-qt4 lupdate]) +-AC_CHECK_PROGS(LRELEASE, [lrelease-qt4 lrelease]) ++AC_CHECK_TOOLS(QMAKE, [qmake-qt5 qmake-qt4 qmake], "no") ++AC_CHECK_TOOLS(LUPDATE, [lupdate-qt5 lupdate-qt4 lupdate]) ++AC_CHECK_TOOLS(LRELEASE, [lrelease-qt5 lrelease-qt4 lrelease]) + + if test "$QMAKE" = no ; then +- AC_MSG_ERROR([Qt4 is required, but not found]); ++ AC_MSG_ERROR([Qt4 or Qt5 is required, but neither was found]); + fi + +-QT_LIBS="-L$($QMAKE -query QT_INSTALL_LIBS) -l QtCore" ++# guess the name of the Qt Core library. ++QT_LIBVER=$($QMAKE -query -query QT_VERSION | sed -e 's/\..*//') ++if test "$QT_LIBVER" -ge 5 ; then ++ QT_LIBS="-L$($QMAKE -query QT_INSTALL_LIBS) -lQt${QT_LIBVER}Core" ++else ++ QT_LIBS="-L$($QMAKE -query QT_INSTALL_LIBS) -lQtCore" ++fi + QT_INC=$($QMAKE -query QT_INSTALL_HEADERS) + QT_INC_OPT="-I" + QT_SYSINC_OPT="-isystem" +@@ -222,6 +229,28 @@ case "$target" in + QT_INC_OPT="-F" + QT_SYSINC_OPT="-iframework" + ;; ++ *-*-freebsd*) ++ GBSER=gbser_posix.o ++ AC_MSG_CHECKING(for libusb) ++ if test "$with_libusb" = no ; then ++ AC_MSG_RESULT(check not done) ++ OSJEEPS=jeeps/gpsusbstub.o ++ else ++ OLDFLAGS=$LDFLAGS ++ OCFLAGS=$CFLAGS ++ LDFLAGS="$LDFLAGS -lusb" ++ CFLAGS="$OCFLAGS" ++ ++ AC_CHECK_LIB([usb], [usb_interrupt_read], ++ AC_DEFINE(HAVE_LIBUSB, 1, [Defined if you have libusb]) ++ [USB_CFLAGS=""] ++ [USB_LIBS="-lusb"] ++# ,[AC_MSG_ERROR([libusb is needed])] ++ ) ++ OSJEEPS=jeeps/gpslibusb.o ++ CFLAGS="$OCFLAGS" ++ fi ++ ;; + *) + GBSER=gbser_posix.o + AC_MSG_CHECKING(for libusb) +@@ -283,6 +312,34 @@ case "$target" in + ;; + esac + ++case "$target" in ++ *-*-darwin*) ++ ;; ++ *) ++ AC_MSG_CHECKING(for reduce relocations) ++ OCPPFLAGS="$CPPFLAGS" ++ CPPFLAGS="$CPPFLAGS -I$QT_INC" ++ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ++ #include ++ void f(void) { ++ }])], ++ [AC_MSG_RESULT(no)], ++ [OCXXFLAGS="$CXXFLAGS" ++ CXXFLAGS="$CXXFLAGS -fPIC" ++ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ++ #include ++ void f(void) { ++ }])], ++ [AC_MSG_RESULT(yes) ++ CFLAGS="$CFLAGS -fPIC"], ++ [AC_MSG_RESULT(unknown) ++ CXXFLAGS="$OCXXFLAGS"] ++ )] ++ ) ++ CPPFLAGS="$OCPPFLAGS" ++ ;; ++esac ++ + AC_MSG_CHECKING(for random stuff to make you feel better) + AC_MSG_RESULT(failed) + +@@ -340,7 +397,7 @@ AC_SUBST(QT_INC_OPT) + AC_SUBST(QT_SYSINC_OPT) + AC_SUBST(QT_LIBS) + +-AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile zlib/empty]) ++AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile]) + AC_CONFIG_FILES([gui/makelinuxdist.sh], [chmod +x gui/makelinuxdist.sh]) + AC_OUTPUT + +diff --git a/gpsbabel/gui/makelinuxdist.sh.in b/gpsbabel/gui/makelinuxdist.sh.in +index 72707f7a..8176d457 100644 +--- a/gpsbabel/gui/makelinuxdist.sh.in ++++ b/gpsbabel/gui/makelinuxdist.sh.in +@@ -7,32 +7,9 @@ DISTNAME=GPSBabel@PACKAGE_VERSION@@PACKAGE_RELEASE@ + DISTDIR=$DISTNAME + rm -rf $DISTDIR + mkdir $DISTDIR +-mkdir $DISTDIR/plugins + mkdir $DISTDIR/translations + mkdir $DISTDIR/help + +-QT_LIBS=`ldd objects/gpsbabelfe-bin | grep libQt | awk '{print $3}'` +-for lib in $QT_LIBS +-do +- cp $lib $DISTDIR +-done +-#cp `ldd objects/gpsbabelfe-bin | grep libphonon |awk '{print $3}'` $DISTDIR +-#cp `ldd objects/gpsbabelfe-bin | grep libaudio |awk '{print $3}'` $DISTDIR +- +-cp -r $QT_INSTALL_PLUGINS/imageformats $DISTDIR/plugins +-if [ -e $QT_INSTALL_PLUGINS/codecs ] +-then +- cp -r $QT_INSTALL_PLUGINS/codecs $DISTDIR/plugins +-else +- echo "Warning: $QT_INSTALL_PLUGINS/codecs not found, perhaps this is normal for Qt5" +-fi +-if [ -e $QT_INSTALL_PLUGINS/platforms ] +-then +-# we need at least platforms/libqxcb.so +- cp -r $QT_INSTALL_PLUGINS/platforms $DISTDIR/plugins +-else +- echo "Wanring: $QT_INSTALL_PLUGINS/platforms not found, this is normal for Qt4" +-fi + cp $QT_INSTALL_TRANSLATIONS/qt_*.qm $DISTDIR/translations/ + + # copy the compiled translations +@@ -40,10 +17,7 @@ cp *.qm $DISTDIR/translations + + # Now our gui + cp gmapbase.html $DISTDIR/ +-cp gpsbabelfe $DISTDIR/ +-chmod +x $DISTDIR/gpsbabelfe +-cp objects/gpsbabelfe-bin $DISTDIR +-cp qt.conf $DISTDIR/ ++cp objects/gpsbabelfe-bin $DISTDIR/gpsbabelfe + cp ../gpsbabel $DISTDIR/ + # + cp -r help/*.html $DISTDIR/help +@@ -53,7 +27,3 @@ cp ../COPYING $DISTDIR/ + cp ../README* $DISTDIR/ + + +-rm -f $DISTDIR.tar $DISTDIR.tar.bz2 +-tar cvf $DISTDIR.tar $DISTDIR +-bzip2 $DISTDIR.tar +- +diff --git a/gpsbabel/tef_xml.cc b/gpsbabel/tef_xml.cc +index c8a64f8d..134eaa17 100644 +--- a/gpsbabel/tef_xml.cc ++++ b/gpsbabel/tef_xml.cc +@@ -72,11 +72,11 @@ tef_start(xg_string args, const QXmlStreamAttributes* attrv) + bool valid = false; + + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Comment", Qt::CaseInsensitive) == 0) { +- if (attr.value().compare("TourExchangeFormat", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Comment"), Qt::CaseInsensitive) == 0) { ++ if (attr.value().compare(QLatin1String("TourExchangeFormat"), Qt::CaseInsensitive) == 0) { + valid = true; + } +- } else if (attr.name().compare("Version", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Version"), Qt::CaseInsensitive) == 0) { + version = attr.value().toString().toDouble(); + } + } +@@ -95,9 +95,9 @@ tef_header(xg_string args, const QXmlStreamAttributes* attrv) + { + route = route_head_alloc(); + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Name", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Name"), Qt::CaseInsensitive) == 0) { + route->rte_name = attr.value().toString().trimmed(); +- } else if (attr.name().compare("Software", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Software"), Qt::CaseInsensitive) == 0) { + route->rte_desc = attr.value().toString().trimmed(); + } + } +@@ -248,20 +248,20 @@ tef_item_start(xg_string args, const QXmlStreamAttributes* attrv) + QString attrstr = attr.value().toString(); + QByteArray attrtext = attrstr.toUtf8(); + +- if (attr.name().compare("SegDescription", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("SegDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->shortname = attrstr.trimmed(); +- } else if (attr.name().compare("PointDescription", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("PointDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("ViaStation", Qt::CaseInsensitive) == 0 && +- attr.value().compare("true", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("ViaStation"), Qt::CaseInsensitive) == 0 && ++ attr.value().compare(QLatin1String("true"), Qt::CaseInsensitive) == 0) { + wpt_tmp->wpt_flags.fmt_use = 1; /* only a flag */ + + /* new in TEF V2 */ +- } else if (attr.name().compare("Instruction", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Instruction"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("Altitude", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Altitude"), Qt::CaseInsensitive) == 0) { + wpt_tmp->altitude = attrstr.toDouble(); +- } else if (attr.name().compare("TimeStamp", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("TimeStamp"), Qt::CaseInsensitive) == 0) { + /* nothing for the moment */ + } + } diff --git a/tools/archive_images/gpsbabel_1_5_2.patch b/tools/archive_images/gpsbabel_1_5_2.patch new file mode 100644 index 000000000..0bda2544b --- /dev/null +++ b/tools/archive_images/gpsbabel_1_5_2.patch @@ -0,0 +1,971 @@ +diff --git a/gpsbabel/Makefile.in b/gpsbabel/Makefile.in +index c767fe22..4a24be80 100644 +--- a/gpsbabel/Makefile.in ++++ b/gpsbabel/Makefile.in +@@ -421,93 +421,93 @@ cov-upload: FORCE + cov-upload + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++alan.o: alan.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++an1.o: an1.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h an1sym.h +-arcdist.o: arcdist.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++arcdist.o: arcdist.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bcr.o: bcr.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_tables.h cet_util.h +-bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bend.o: bend.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-bushnell.o: bushnell.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++bushnell.o: bushnell.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++cet.o: cet.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++cet_util.o: cet_util.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + cet/ansi_x3_4_1968.h cet/cp1252.h cet/iso_8859_8.h +-compegps.o: compegps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++compegps.o: compegps.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cst.o: cst.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h strptime.h +-csv_util.o: csv_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++csv_util.o: csv_util.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + grtcirc.h src/core/logging.h strptime.h xcsv_tokens.gperf +-delbin.o: delbin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delbin.o: delbin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h +-delgpl.o: delgpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delgpl.o: delgpl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-destinator.o: destinator.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++destinator.o: destinator.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + strptime.h +-dg-100.o: dg-100.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dg-100.o: dg-100.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +-discard.o: discard.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++discard.o: discard.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-dmtlog.o: dmtlog.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dmtlog.o: dmtlog.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++duplicate.o: duplicate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-easygps.o: easygps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++easygps.o: easygps.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-energympro.o: energympro.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-enigma.o: enigma.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++energympro.o: energympro.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++enigma.o: enigma.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++exif.o: exif.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + explorist_ini.h +-f90g_track.o: f90g_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-fatal.o: fatal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++f90g_track.o: f90g_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++fatal.o: fatal.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-filter_vecs.o: filter_vecs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h gbversion.h +-formspec.o: formspec.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++formspec.o: formspec.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-g7towin.o: g7towin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++g7towin.o: g7towin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin.o: garmin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ +@@ -515,82 +515,82 @@ garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h garmin_tables.h garmin_fs.h garmin_device_xml.h + garmin_device_xml.o: garmin_device_xml.cc defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h garmin_device_xml.h +-garmin_fit.o: garmin_fit.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-garmin_fs.o: garmin_fs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++garmin_fs.o: garmin_fs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h jeeps/gpsmath.h jeeps/gpsport.h garmin_fs.h jeeps/gps.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_gpi.h + garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h src/core/logging.h jeeps/gpsmath.h jeeps/gpsport.h +-garmin_txt.o: garmin_txt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h grtcirc.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-gbfile.o: gbfile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++gbfile.o: gbfile.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/logging.h +-gbser.o: gbser.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbser.o: gbser.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h gbser_private.h + gbsleep.o: gbsleep.cc config.h +-gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gdb.o: gdb.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h grtcirc.h +-geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++geo.o: geo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h src/core/file.h +-ggv_log.o: ggv_log.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_log.o: ggv_log.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++globals.o: globals.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbversion.h +-glogbook.o: glogbook.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++glogbook.o: glogbook.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + src/core/file.h +-gnav_trl.o: gnav_trl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-google.o: google.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++google.o: google.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-googledir.o: googledir.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++googledir.o: googledir.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gopal.o: gopal.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-gpssim.o: gpssim.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpssim.o: gpssim.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-gpsutil.o: gpsutil.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpsutil.o: gpsutil.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + magellan.h +-gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gpx.o: gpx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ +@@ -598,79 +598,79 @@ gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ + src/core/logging.h src/core/file.h src/core/xmlstreamwriter.h \ + src/core/xmltag.h +-grtcirc.o: grtcirc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++grtcirc.o: grtcirc.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gtm.o: gtm.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-height.o: height.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++height.o: height.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + height.h +-hiketech.o: hiketech.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++hiketech.o: hiketech.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + src/core/xmlstreamwriter.h +-holux.o: holux.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++holux.o: holux.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h holux.h +-html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++html.o: html.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++humminbird.o: humminbird.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++igc.o: igc.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h +-ignrando.o: ignrando.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ignrando.o: ignrando.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igo8.o: igo8.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h +-ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ik3d.o: ik3d.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++inifile.o: inifile.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-internal_styles.o: internal_styles.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-interpolate.o: interpolate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++internal_styles.o: internal_styles.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++interpolate.o: interpolate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-itracku.o: itracku.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++itracku.o: itracku.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h \ + jeeps/gpsusbint.h jeeps/gpsserial.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h jeeps/gpsusbcommon.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ +- jeeps/gps.h jeeps/../defs.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ jeeps/gps.h jeeps/../defs.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ +@@ -678,89 +678,89 @@ jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h \ + jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h jeeps/../gbser.h gbser_posix.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-jogmap.o: jogmap.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++jogmap.o: jogmap.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++jtr.o: jtr.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h +-kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++kml.o: kml.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h grtcirc.h \ + src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h +-lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++lmx.o: lmx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h ++lowranceusr.o: lowranceusr.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h + mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ + mac/libusb/usb.h mac/libusb/error.h + mac/libusb/descriptors.o: mac/libusb/descriptors.c mac/libusb/usbi.h \ +@@ -769,261 +769,233 @@ mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ + mac/libusb/error.h + mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ + mac/libusb/error.h +-maggeo.o: maggeo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++maggeo.o: maggeo.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + xmlgeneric.h magellan.h +-magproto.o: magproto.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++magproto.o: magproto.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h magellan.h \ + gbser.h explorist_ini.h +-main.o: main.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++main.o: main.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h cet_util.h \ + csv_util.h src/core/usasciicodec.h +-mapasia.o: mapasia.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapasia.o: mapasia.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-mapbar_track.o: mapbar_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-mapfactor.o: mapfactor.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++mapfactor.o: mapfactor.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/file.h src/core/xmlstreamwriter.h +-mapsend.o: mapsend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapsend.o: mapsend.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h mapsend.h \ + magellan.h +-mapsource.o: mapsource.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mapsource.o: mapsource.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-mkshort.o: mkshort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mkshort.o: mkshort.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h +-mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++mmo.o: mmo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-mtk_locus.o: mtk_locus.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-mynav.o: mynav.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mynav.o: mynav.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-navicache.o: navicache.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++navicache.o: navicache.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++naviguide.o: naviguide.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navilink.o: navilink.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navitel.o: navitel.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-netstumbler.o: netstumbler.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++netstumbler.o: netstumbler.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h +-nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmea.o: nmea.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h gbser.h \ + strptime.h jeeps/gpsmath.h jeeps/gpsport.h +-nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmn4.o: nmn4.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h +-nukedata.o: nukedata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++nukedata.o: nukedata.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++osm.o: osm.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ozi.o: ozi.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-parse.o: parse.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++parse.o: parse.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h strptime.h +-pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++pcx.o: pcx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + cet_util.h csv_util.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-polygon.o: polygon.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++polygon.o: polygon.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-position.o: position.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++position.o: position.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-psitrex.o: psitrex.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++psitrex.o: psitrex.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h + queue.o: queue.cc queue.h +-radius.o: radius.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++radius.o: radius.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-random.o: random.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++random.o: random.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-raymarine.o: raymarine.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++raymarine.o: raymarine.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++reverse_route.o: reverse_route.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-rgbcolors.o: rgbcolors.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-route.o: route.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++route.o: route.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-saroute.o: saroute.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++saroute.o: saroute.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbn.o: sbn.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h navilink.h +-sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbp.o: sbp.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h navilink.h +-session.o: session.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++session.o: session.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-shape.o: shape.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++shape.o: shape.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skyforce.o: skyforce.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-skytraq.o: skytraq.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skytraq.o: skytraq.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +-smplrout.o: smplrout.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++smplrout.o: smplrout.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sort.o: sort.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h + src/core/usasciicodec.o: src/core/usasciicodec.cc src/core/usasciicodec.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++stackfilter.o: stackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-stmsdf.o: stmsdf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmsdf.o: stmsdf.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-stmwpp.o: stmwpp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmwpp.o: stmwpp.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + cet_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++subrip.o: subrip.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-swapdata.o: swapdata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++swapdata.o: swapdata.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-tef_xml.o: tef_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tef_xml.o: tef_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++teletype.o: teletype.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++text.o: text.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tiger.o: tiger.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h +-tmpro.o: tmpro.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tmpro.o: tmpro.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h +-tomtom.o: tomtom.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tomtom.o: tomtom.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpg.o: tpg.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpo.o: tpo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++trackfilter.o: trackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h strptime.h xmlgeneric.h +-transform.o: transform.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++transform.o: transform.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-unicsv.o: unicsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++unicsv.o: unicsv.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-units.o: units.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++units.o: units.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++util.o: util.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h src/core/xmltag.h \ + jeeps/gpsmath.h jeeps/gpsport.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++v900.o: v900.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-validate.o: validate.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++validate.o: validate.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vcf.o: vcf.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vecs.o: vecs.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h gbversion.h +-vidaone.o: vidaone.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vidaone.o: vidaone.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-vitosmt.o: vitosmt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitosmt.o: vitosmt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitovtt.o: vitovtt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vpl.o: vpl.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-waypt.o: waypt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++waypt.o: waypt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + src/core/logging.h +-wbt-200.o: wbt-200.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wbt-200.o: wbt-200.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-xcsv.o: xcsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++xcsv.o: xcsv.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h + xhtmlent.o: xhtmlent.cc +-xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h cet_util.h src/core/file.h +-xmltag.o: xmltag.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++xmltag.o: xmltag.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + src/core/xmltag.h +-xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xol.o: xol.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-yahoo.o: yahoo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++yahoo.o: yahoo.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) +diff --git a/gpsbabel/configure.in b/gpsbabel/configure.in +index e10ee475..1aa48807 100644 +--- a/gpsbabel/configure.in ++++ b/gpsbabel/configure.in +@@ -325,13 +325,13 @@ case "$target" in + }])], + [AC_MSG_RESULT(no)], + [OCXXFLAGS="$CXXFLAGS" +- CXXFLAGS="$CXXFLAGS -fPIE" ++ CXXFLAGS="$CXXFLAGS -fPIC" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + void f(void) { + }])], + [AC_MSG_RESULT(yes) +- CFLAGS="$CFLAGS -fPIE"], ++ CFLAGS="$CFLAGS -fPIC"], + [AC_MSG_RESULT(unknown) + CXXFLAGS="$OCXXFLAGS"] + )] +@@ -397,7 +397,7 @@ AC_SUBST(QT_INC_OPT) + AC_SUBST(QT_SYSINC_OPT) + AC_SUBST(QT_LIBS) + +-AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile zlib/empty]) ++AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile]) + AC_CONFIG_FILES([gui/makelinuxdist.sh], [chmod +x gui/makelinuxdist.sh]) + AC_OUTPUT + +diff --git a/gpsbabel/gui/makelinuxdist.sh.in b/gpsbabel/gui/makelinuxdist.sh.in +index 72707f7a..8176d457 100644 +--- a/gpsbabel/gui/makelinuxdist.sh.in ++++ b/gpsbabel/gui/makelinuxdist.sh.in +@@ -7,32 +7,9 @@ DISTNAME=GPSBabel@PACKAGE_VERSION@@PACKAGE_RELEASE@ + DISTDIR=$DISTNAME + rm -rf $DISTDIR + mkdir $DISTDIR +-mkdir $DISTDIR/plugins + mkdir $DISTDIR/translations + mkdir $DISTDIR/help + +-QT_LIBS=`ldd objects/gpsbabelfe-bin | grep libQt | awk '{print $3}'` +-for lib in $QT_LIBS +-do +- cp $lib $DISTDIR +-done +-#cp `ldd objects/gpsbabelfe-bin | grep libphonon |awk '{print $3}'` $DISTDIR +-#cp `ldd objects/gpsbabelfe-bin | grep libaudio |awk '{print $3}'` $DISTDIR +- +-cp -r $QT_INSTALL_PLUGINS/imageformats $DISTDIR/plugins +-if [ -e $QT_INSTALL_PLUGINS/codecs ] +-then +- cp -r $QT_INSTALL_PLUGINS/codecs $DISTDIR/plugins +-else +- echo "Warning: $QT_INSTALL_PLUGINS/codecs not found, perhaps this is normal for Qt5" +-fi +-if [ -e $QT_INSTALL_PLUGINS/platforms ] +-then +-# we need at least platforms/libqxcb.so +- cp -r $QT_INSTALL_PLUGINS/platforms $DISTDIR/plugins +-else +- echo "Wanring: $QT_INSTALL_PLUGINS/platforms not found, this is normal for Qt4" +-fi + cp $QT_INSTALL_TRANSLATIONS/qt_*.qm $DISTDIR/translations/ + + # copy the compiled translations +@@ -40,10 +17,7 @@ cp *.qm $DISTDIR/translations + + # Now our gui + cp gmapbase.html $DISTDIR/ +-cp gpsbabelfe $DISTDIR/ +-chmod +x $DISTDIR/gpsbabelfe +-cp objects/gpsbabelfe-bin $DISTDIR +-cp qt.conf $DISTDIR/ ++cp objects/gpsbabelfe-bin $DISTDIR/gpsbabelfe + cp ../gpsbabel $DISTDIR/ + # + cp -r help/*.html $DISTDIR/help +@@ -53,7 +27,3 @@ cp ../COPYING $DISTDIR/ + cp ../README* $DISTDIR/ + + +-rm -f $DISTDIR.tar $DISTDIR.tar.bz2 +-tar cvf $DISTDIR.tar $DISTDIR +-bzip2 $DISTDIR.tar +- +diff --git a/gpsbabel/tef_xml.cc b/gpsbabel/tef_xml.cc +index c8a64f8d..134eaa17 100644 +--- a/gpsbabel/tef_xml.cc ++++ b/gpsbabel/tef_xml.cc +@@ -72,11 +72,11 @@ tef_start(xg_string args, const QXmlStreamAttributes* attrv) + bool valid = false; + + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Comment", Qt::CaseInsensitive) == 0) { +- if (attr.value().compare("TourExchangeFormat", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Comment"), Qt::CaseInsensitive) == 0) { ++ if (attr.value().compare(QLatin1String("TourExchangeFormat"), Qt::CaseInsensitive) == 0) { + valid = true; + } +- } else if (attr.name().compare("Version", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Version"), Qt::CaseInsensitive) == 0) { + version = attr.value().toString().toDouble(); + } + } +@@ -95,9 +95,9 @@ tef_header(xg_string args, const QXmlStreamAttributes* attrv) + { + route = route_head_alloc(); + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Name", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Name"), Qt::CaseInsensitive) == 0) { + route->rte_name = attr.value().toString().trimmed(); +- } else if (attr.name().compare("Software", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Software"), Qt::CaseInsensitive) == 0) { + route->rte_desc = attr.value().toString().trimmed(); + } + } +@@ -248,20 +248,20 @@ tef_item_start(xg_string args, const QXmlStreamAttributes* attrv) + QString attrstr = attr.value().toString(); + QByteArray attrtext = attrstr.toUtf8(); + +- if (attr.name().compare("SegDescription", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("SegDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->shortname = attrstr.trimmed(); +- } else if (attr.name().compare("PointDescription", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("PointDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("ViaStation", Qt::CaseInsensitive) == 0 && +- attr.value().compare("true", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("ViaStation"), Qt::CaseInsensitive) == 0 && ++ attr.value().compare(QLatin1String("true"), Qt::CaseInsensitive) == 0) { + wpt_tmp->wpt_flags.fmt_use = 1; /* only a flag */ + + /* new in TEF V2 */ +- } else if (attr.name().compare("Instruction", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Instruction"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("Altitude", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Altitude"), Qt::CaseInsensitive) == 0) { + wpt_tmp->altitude = attrstr.toDouble(); +- } else if (attr.name().compare("TimeStamp", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("TimeStamp"), Qt::CaseInsensitive) == 0) { + /* nothing for the moment */ + } + } diff --git a/tools/archive_images/gpsbabel_1_5_3.patch b/tools/archive_images/gpsbabel_1_5_3.patch new file mode 100644 index 000000000..622bacaa1 --- /dev/null +++ b/tools/archive_images/gpsbabel_1_5_3.patch @@ -0,0 +1,985 @@ +diff --git a/Makefile.in b/Makefile.in +index 3752efc1..0ce58112 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -102,9 +102,6 @@ JEEPS=jeeps/gpsapp.o jeeps/gpscom.o \ + + SHAPE=shapelib/shpopen.o shapelib/dbfopen.o shapelib/safileio.o + +-MINIZIP=zlib/contrib/minizip/zip.o \ +- zlib/contrib/minizip/ioapi.o +- + ZLIB=zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o zlib/inffast.o \ + zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/trees.o \ + zlib/uncompr.o zlib/gzlib.o zlib/gzclose.o zlib/gzread.o \ +@@ -118,7 +115,6 @@ LIBOBJS = queue.o route.o waypt.o filter_vecs.o util.o vecs.o mkshort.o \ + gbfile.o parse.o session.o \ + src/core/xmlstreamwriter.o \ + src/core/usasciicodec.o\ +- src/core/ziparchive.o \ + $(GARMIN) $(JEEPS) $(SHAPE) @ZLIB@ $(FMTS) $(FILTERS) + OBJS = main.o globals.o $(LIBOBJS) @FILEINFO@ + +@@ -432,93 +428,93 @@ toolinfo: + -$(QMAKE) -v + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++alan.o: alan.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++an1.o: an1.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h an1sym.h +-arcdist.o: arcdist.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++arcdist.o: arcdist.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bcr.o: bcr.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_tables.h cet_util.h +-bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bend.o: bend.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-bushnell.o: bushnell.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++bushnell.o: bushnell.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++cet.o: cet.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++cet_util.o: cet_util.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + cet/ansi_x3_4_1968.h cet/cp1252.h cet/iso_8859_8.h +-compegps.o: compegps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++compegps.o: compegps.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cst.o: cst.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h strptime.h +-csv_util.o: csv_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++csv_util.o: csv_util.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + grtcirc.h src/core/logging.h strptime.h xcsv_tokens.gperf +-delbin.o: delbin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delbin.o: delbin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/xmltag.h +-delgpl.o: delgpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delgpl.o: delgpl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-destinator.o: destinator.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++destinator.o: destinator.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + strptime.h +-dg-100.o: dg-100.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dg-100.o: dg-100.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +-discard.o: discard.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++discard.o: discard.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-dmtlog.o: dmtlog.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dmtlog.o: dmtlog.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++duplicate.o: duplicate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-easygps.o: easygps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++easygps.o: easygps.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-energympro.o: energympro.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-enigma.o: enigma.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++energympro.o: energympro.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++enigma.o: enigma.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++exif.o: exif.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + explorist_ini.h +-f90g_track.o: f90g_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-fatal.o: fatal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++f90g_track.o: f90g_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++fatal.o: fatal.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-filter_vecs.o: filter_vecs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h gbversion.h +-formspec.o: formspec.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++formspec.o: formspec.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-g7towin.o: g7towin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++g7towin.o: g7towin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin.o: garmin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ +@@ -526,82 +522,82 @@ garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h garmin_tables.h garmin_fs.h garmin_device_xml.h + garmin_device_xml.o: garmin_device_xml.cc defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h garmin_device_xml.h +-garmin_fit.o: garmin_fit.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-garmin_fs.o: garmin_fs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++garmin_fs.o: garmin_fs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h jeeps/gpsmath.h jeeps/gpsport.h garmin_fs.h jeeps/gps.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_gpi.h + garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h src/core/logging.h jeeps/gpsmath.h jeeps/gpsport.h +-garmin_txt.o: garmin_txt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h grtcirc.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-gbfile.o: gbfile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++gbfile.o: gbfile.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/logging.h +-gbser.o: gbser.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbser.o: gbser.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h gbser_private.h + gbsleep.o: gbsleep.cc config.h +-gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gdb.o: gdb.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h grtcirc.h +-geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++geo.o: geo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h src/core/file.h +-ggv_log.o: ggv_log.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_log.o: ggv_log.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++globals.o: globals.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbversion.h +-glogbook.o: glogbook.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++glogbook.o: glogbook.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + src/core/file.h +-gnav_trl.o: gnav_trl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-google.o: google.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++google.o: google.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-googledir.o: googledir.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++googledir.o: googledir.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gopal.o: gopal.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-gpssim.o: gpssim.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpssim.o: gpssim.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-gpsutil.o: gpsutil.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpsutil.o: gpsutil.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + magellan.h +-gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gpx.o: gpx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ +@@ -609,79 +605,79 @@ gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ + src/core/logging.h src/core/file.h src/core/xmlstreamwriter.h \ + src/core/xmltag.h +-grtcirc.o: grtcirc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++grtcirc.o: grtcirc.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gtm.o: gtm.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-height.o: height.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++height.o: height.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + height.h +-hiketech.o: hiketech.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++hiketech.o: hiketech.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + src/core/xmlstreamwriter.h +-holux.o: holux.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++holux.o: holux.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h holux.h +-html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++html.o: html.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++humminbird.o: humminbird.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++igc.o: igc.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h +-ignrando.o: ignrando.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ignrando.o: ignrando.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igo8.o: igo8.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h +-ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ik3d.o: ik3d.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++inifile.o: inifile.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-internal_styles.o: internal_styles.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-interpolate.o: interpolate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++internal_styles.o: internal_styles.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++interpolate.o: interpolate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-itracku.o: itracku.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++itracku.o: itracku.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h \ + jeeps/gpsusbint.h jeeps/gpsserial.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h jeeps/gpsusbcommon.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ +- jeeps/gps.h jeeps/../defs.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ jeeps/gps.h jeeps/../defs.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ +@@ -689,89 +685,89 @@ jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h \ + jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h jeeps/../gbser.h gbser_posix.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-jogmap.o: jogmap.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++jogmap.o: jogmap.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++jtr.o: jtr.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h +-kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++kml.o: kml.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h grtcirc.h \ + src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h +-lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++lmx.o: lmx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h ++lowranceusr.o: lowranceusr.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h + mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ + mac/libusb/usb.h mac/libusb/error.h + mac/libusb/descriptors.o: mac/libusb/descriptors.c mac/libusb/usbi.h \ +@@ -780,261 +776,233 @@ mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ + mac/libusb/error.h + mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ + mac/libusb/error.h +-maggeo.o: maggeo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++maggeo.o: maggeo.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + xmlgeneric.h magellan.h +-magproto.o: magproto.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++magproto.o: magproto.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h magellan.h \ + gbser.h explorist_ini.h +-main.o: main.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++main.o: main.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h cet_util.h \ + csv_util.h src/core/usasciicodec.h +-mapasia.o: mapasia.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapasia.o: mapasia.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-mapbar_track.o: mapbar_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-mapfactor.o: mapfactor.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++mapfactor.o: mapfactor.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/file.h src/core/xmlstreamwriter.h +-mapsend.o: mapsend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapsend.o: mapsend.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h mapsend.h \ + magellan.h +-mapsource.o: mapsource.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mapsource.o: mapsource.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-mkshort.o: mkshort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mkshort.o: mkshort.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h +-mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++mmo.o: mmo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-mtk_locus.o: mtk_locus.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-mynav.o: mynav.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mynav.o: mynav.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-navicache.o: navicache.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++navicache.o: navicache.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++naviguide.o: naviguide.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navilink.o: navilink.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navitel.o: navitel.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-netstumbler.o: netstumbler.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++netstumbler.o: netstumbler.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h +-nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmea.o: nmea.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h gbser.h \ + strptime.h jeeps/gpsmath.h jeeps/gpsport.h +-nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmn4.o: nmn4.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h +-nukedata.o: nukedata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++nukedata.o: nukedata.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++osm.o: osm.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ozi.o: ozi.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-parse.o: parse.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++parse.o: parse.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h strptime.h +-pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++pcx.o: pcx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + cet_util.h csv_util.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-polygon.o: polygon.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++polygon.o: polygon.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-position.o: position.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++position.o: position.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-psitrex.o: psitrex.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++psitrex.o: psitrex.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h + queue.o: queue.cc queue.h +-radius.o: radius.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++radius.o: radius.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-random.o: random.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++random.o: random.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-raymarine.o: raymarine.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++raymarine.o: raymarine.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++reverse_route.o: reverse_route.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-rgbcolors.o: rgbcolors.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-route.o: route.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++route.o: route.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-saroute.o: saroute.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++saroute.o: saroute.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbn.o: sbn.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h navilink.h +-sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbp.o: sbp.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h navilink.h +-session.o: session.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++session.o: session.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-shape.o: shape.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++shape.o: shape.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skyforce.o: skyforce.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-skytraq.o: skytraq.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skytraq.o: skytraq.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +-smplrout.o: smplrout.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++smplrout.o: smplrout.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sort.o: sort.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h + src/core/usasciicodec.o: src/core/usasciicodec.cc src/core/usasciicodec.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++stackfilter.o: stackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-stmsdf.o: stmsdf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmsdf.o: stmsdf.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-stmwpp.o: stmwpp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmwpp.o: stmwpp.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + cet_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++subrip.o: subrip.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-swapdata.o: swapdata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++swapdata.o: swapdata.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-tef_xml.o: tef_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tef_xml.o: tef_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++teletype.o: teletype.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++text.o: text.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tiger.o: tiger.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h +-tmpro.o: tmpro.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tmpro.o: tmpro.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h +-tomtom.o: tomtom.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tomtom.o: tomtom.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpg.o: tpg.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpo.o: tpo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++trackfilter.o: trackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h strptime.h xmlgeneric.h +-transform.o: transform.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++transform.o: transform.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-unicsv.o: unicsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++unicsv.o: unicsv.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-units.o: units.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++units.o: units.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++util.o: util.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h src/core/xmltag.h \ + jeeps/gpsmath.h jeeps/gpsport.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++v900.o: v900.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-validate.o: validate.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++validate.o: validate.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vcf.o: vcf.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vecs.o: vecs.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h gbversion.h +-vidaone.o: vidaone.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vidaone.o: vidaone.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-vitosmt.o: vitosmt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitosmt.o: vitosmt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitovtt.o: vitovtt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vpl.o: vpl.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-waypt.o: waypt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++waypt.o: waypt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + src/core/logging.h +-wbt-200.o: wbt-200.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wbt-200.o: wbt-200.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-xcsv.o: xcsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++xcsv.o: xcsv.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h + xhtmlent.o: xhtmlent.cc +-xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h cet_util.h src/core/file.h +-xmltag.o: xmltag.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++xmltag.o: xmltag.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + src/core/xmltag.h +-xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xol.o: xol.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-yahoo.o: yahoo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++yahoo.o: yahoo.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) +diff --git a/configure.in b/configure.in +index d8fd5d4e..a6afd36a 100644 +--- a/configure.in ++++ b/configure.in +@@ -397,7 +397,7 @@ AC_SUBST(QT_INC_OPT) + AC_SUBST(QT_SYSINC_OPT) + AC_SUBST(QT_LIBS) + +-AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile zlib/empty]) ++AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile]) + AC_CONFIG_FILES([gui/makelinuxdist.sh], [chmod +x gui/makelinuxdist.sh]) + AC_OUTPUT + +diff --git a/gpx.cc b/gpx.cc +index e5fa054c..a6fc26be 100644 +--- a/gpx.cc ++++ b/gpx.cc +@@ -28,7 +28,6 @@ + #include "src/core/file.h" + #include "src/core/xmlstreamwriter.h" + #include "src/core/xmltag.h" +-#include "src/core/ziparchive.h" + + #include + #include +diff --git a/gui/makelinuxdist.sh.in b/gui/makelinuxdist.sh.in +index 72707f7a..8176d457 100644 +--- a/gui/makelinuxdist.sh.in ++++ b/gui/makelinuxdist.sh.in +@@ -7,32 +7,9 @@ DISTNAME=GPSBabel@PACKAGE_VERSION@@PACKAGE_RELEASE@ + DISTDIR=$DISTNAME + rm -rf $DISTDIR + mkdir $DISTDIR +-mkdir $DISTDIR/plugins + mkdir $DISTDIR/translations + mkdir $DISTDIR/help + +-QT_LIBS=`ldd objects/gpsbabelfe-bin | grep libQt | awk '{print $3}'` +-for lib in $QT_LIBS +-do +- cp $lib $DISTDIR +-done +-#cp `ldd objects/gpsbabelfe-bin | grep libphonon |awk '{print $3}'` $DISTDIR +-#cp `ldd objects/gpsbabelfe-bin | grep libaudio |awk '{print $3}'` $DISTDIR +- +-cp -r $QT_INSTALL_PLUGINS/imageformats $DISTDIR/plugins +-if [ -e $QT_INSTALL_PLUGINS/codecs ] +-then +- cp -r $QT_INSTALL_PLUGINS/codecs $DISTDIR/plugins +-else +- echo "Warning: $QT_INSTALL_PLUGINS/codecs not found, perhaps this is normal for Qt5" +-fi +-if [ -e $QT_INSTALL_PLUGINS/platforms ] +-then +-# we need at least platforms/libqxcb.so +- cp -r $QT_INSTALL_PLUGINS/platforms $DISTDIR/plugins +-else +- echo "Wanring: $QT_INSTALL_PLUGINS/platforms not found, this is normal for Qt4" +-fi + cp $QT_INSTALL_TRANSLATIONS/qt_*.qm $DISTDIR/translations/ + + # copy the compiled translations +@@ -40,10 +17,7 @@ cp *.qm $DISTDIR/translations + + # Now our gui + cp gmapbase.html $DISTDIR/ +-cp gpsbabelfe $DISTDIR/ +-chmod +x $DISTDIR/gpsbabelfe +-cp objects/gpsbabelfe-bin $DISTDIR +-cp qt.conf $DISTDIR/ ++cp objects/gpsbabelfe-bin $DISTDIR/gpsbabelfe + cp ../gpsbabel $DISTDIR/ + # + cp -r help/*.html $DISTDIR/help +@@ -53,7 +27,3 @@ cp ../COPYING $DISTDIR/ + cp ../README* $DISTDIR/ + + +-rm -f $DISTDIR.tar $DISTDIR.tar.bz2 +-tar cvf $DISTDIR.tar $DISTDIR +-bzip2 $DISTDIR.tar +- +diff --git a/tef_xml.cc b/tef_xml.cc +index c8a64f8d..134eaa17 100644 +--- a/tef_xml.cc ++++ b/tef_xml.cc +@@ -72,11 +72,11 @@ tef_start(xg_string args, const QXmlStreamAttributes* attrv) + bool valid = false; + + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Comment", Qt::CaseInsensitive) == 0) { +- if (attr.value().compare("TourExchangeFormat", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Comment"), Qt::CaseInsensitive) == 0) { ++ if (attr.value().compare(QLatin1String("TourExchangeFormat"), Qt::CaseInsensitive) == 0) { + valid = true; + } +- } else if (attr.name().compare("Version", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Version"), Qt::CaseInsensitive) == 0) { + version = attr.value().toString().toDouble(); + } + } +@@ -95,9 +95,9 @@ tef_header(xg_string args, const QXmlStreamAttributes* attrv) + { + route = route_head_alloc(); + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Name", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Name"), Qt::CaseInsensitive) == 0) { + route->rte_name = attr.value().toString().trimmed(); +- } else if (attr.name().compare("Software", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Software"), Qt::CaseInsensitive) == 0) { + route->rte_desc = attr.value().toString().trimmed(); + } + } +@@ -248,20 +248,20 @@ tef_item_start(xg_string args, const QXmlStreamAttributes* attrv) + QString attrstr = attr.value().toString(); + QByteArray attrtext = attrstr.toUtf8(); + +- if (attr.name().compare("SegDescription", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("SegDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->shortname = attrstr.trimmed(); +- } else if (attr.name().compare("PointDescription", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("PointDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("ViaStation", Qt::CaseInsensitive) == 0 && +- attr.value().compare("true", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("ViaStation"), Qt::CaseInsensitive) == 0 && ++ attr.value().compare(QLatin1String("true"), Qt::CaseInsensitive) == 0) { + wpt_tmp->wpt_flags.fmt_use = 1; /* only a flag */ + + /* new in TEF V2 */ +- } else if (attr.name().compare("Instruction", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Instruction"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("Altitude", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Altitude"), Qt::CaseInsensitive) == 0) { + wpt_tmp->altitude = attrstr.toDouble(); +- } else if (attr.name().compare("TimeStamp", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("TimeStamp"), Qt::CaseInsensitive) == 0) { + /* nothing for the moment */ + } + } diff --git a/tools/archive_images/gpsbabel_1_5_4.patch b/tools/archive_images/gpsbabel_1_5_4.patch new file mode 100644 index 000000000..bd5b464ef --- /dev/null +++ b/tools/archive_images/gpsbabel_1_5_4.patch @@ -0,0 +1,974 @@ +diff --git a/Makefile.in b/Makefile.in +index 83af6048..ae94a7bd 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -102,9 +102,6 @@ JEEPS=jeeps/gpsapp.o jeeps/gpscom.o \ + + SHAPE=shapelib/shpopen.o shapelib/dbfopen.o shapelib/safileio.o + +-MINIZIP=zlib/contrib/minizip/zip.o \ +- zlib/contrib/minizip/ioapi.o +- + ZLIB=zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o zlib/inffast.o \ + zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/trees.o \ + zlib/uncompr.o zlib/gzlib.o zlib/gzclose.o zlib/gzread.o \ +@@ -118,7 +115,6 @@ LIBOBJS = queue.o route.o waypt.o filter_vecs.o util.o vecs.o mkshort.o \ + gbfile.o parse.o session.o \ + src/core/xmlstreamwriter.o \ + src/core/usasciicodec.o\ +- src/core/ziparchive.o \ + $(GARMIN) $(JEEPS) $(SHAPE) @ZLIB@ $(FMTS) $(FILTERS) + OBJS = main.o globals.o $(LIBOBJS) @FILEINFO@ + +@@ -435,90 +431,90 @@ toolinfo: + -$(QMAKE) -v + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++alan.o: alan.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++an1.o: an1.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h an1sym.h +-arcdist.o: arcdist.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++arcdist.o: arcdist.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bcr.o: bcr.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + garmin_tables.h cet_util.h +-bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bend.o: bend.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-bushnell.o: bushnell.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++bushnell.o: bushnell.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++cet.o: cet.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++cet_util.o: cet_util.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + cet/ansi_x3_4_1968.h cet/cp1252.h cet/iso_8859_8.h +-compegps.o: compegps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++compegps.o: compegps.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++cst.o: cst.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h strptime.h +-csv_util.o: csv_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++csv_util.o: csv_util.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + grtcirc.h src/core/logging.h strptime.h xcsv_tokens.gperf +-delgpl.o: delgpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++delgpl.o: delgpl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-destinator.o: destinator.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++destinator.o: destinator.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + strptime.h +-dg-100.o: dg-100.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dg-100.o: dg-100.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +-discard.o: discard.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++discard.o: discard.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-dmtlog.o: dmtlog.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++dmtlog.o: dmtlog.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++duplicate.o: duplicate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-easygps.o: easygps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++easygps.o: easygps.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-energympro.o: energympro.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-enigma.o: enigma.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++energympro.o: energympro.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++enigma.o: enigma.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++exif.o: exif.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + explorist_ini.h +-f90g_track.o: f90g_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-fatal.o: fatal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++f90g_track.o: f90g_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++fatal.o: fatal.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-filter_vecs.o: filter_vecs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h gbversion.h +-formspec.o: formspec.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++formspec.o: formspec.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-g7towin.o: g7towin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++g7towin.o: g7towin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin.o: garmin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ +@@ -526,85 +522,85 @@ garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h garmin_tables.h garmin_fs.h garmin_device_xml.h + garmin_device_xml.o: garmin_device_xml.cc defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h garmin_device_xml.h +-garmin_fit.o: garmin_fit.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-garmin_fs.o: garmin_fs.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++garmin_fs.o: garmin_fs.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h jeeps/gpsmath.h jeeps/gpsport.h garmin_fs.h jeeps/gps.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_gpi.h + garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h queue.h \ +- zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h src/core/logging.h jeeps/gpsmath.h jeeps/gpsport.h +-garmin_txt.o: garmin_txt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h garmin_tables.h grtcirc.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-gbfile.o: gbfile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++gbfile.o: gbfile.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/logging.h +-gbser.o: gbser.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gbser.o: gbser.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h gbser_private.h + gbsleep.o: gbsleep.cc config.h +-gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gdb.o: gdb.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h grtcirc.h +-geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++geo.o: geo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h src/core/file.h +-ggv_bin.o: ggv_bin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_bin.o: ggv_bin.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-ggv_log.o: ggv_log.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_log.o: ggv_log.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++globals.o: globals.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbversion.h +-globalsat_sport.o: globalsat_sport.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ ++globalsat_sport.o: globalsat_sport.cc defs.h config.h queue.h \ ++ config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h gbser.h +-glogbook.o: glogbook.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++glogbook.o: glogbook.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + src/core/file.h +-gnav_trl.o: gnav_trl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-googledir.o: googledir.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++googledir.o: googledir.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gopal.o: gopal.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-gpssim.o: gpssim.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpssim.o: gpssim.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-gpsutil.o: gpsutil.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gpsutil.o: gpsutil.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + magellan.h +-gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gpx.o: gpx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ +@@ -612,79 +608,79 @@ gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ + src/core/logging.h src/core/file.h src/core/xmlstreamwriter.h \ + src/core/xmltag.h +-grtcirc.o: grtcirc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++grtcirc.o: grtcirc.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++gtm.o: gtm.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-height.o: height.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++height.o: height.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + height.h +-hiketech.o: hiketech.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++hiketech.o: hiketech.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + src/core/xmlstreamwriter.h +-holux.o: holux.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++holux.o: holux.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h holux.h +-html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++html.o: html.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++humminbird.o: humminbird.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++igc.o: igc.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h +-ignrando.o: ignrando.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++ignrando.o: ignrando.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++igo8.o: igo8.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h +-ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ik3d.o: ik3d.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++inifile.o: inifile.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-internal_styles.o: internal_styles.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-interpolate.o: interpolate.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++internal_styles.o: internal_styles.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++interpolate.o: interpolate.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h +-itracku.o: itracku.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++itracku.o: itracku.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h \ + jeeps/gpsusbint.h jeeps/gpsserial.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h jeeps/gpsusbcommon.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ +- jeeps/gps.h jeeps/../defs.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ jeeps/gps.h jeeps/../defs.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ +@@ -692,89 +688,89 @@ jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h \ + jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsserial.h jeeps/../gbser.h gbser_posix.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ ++ config.h queue.h gbfile.h cet.h inifile.h \ + session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ ++ queue.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-jogmap.o: jogmap.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++jogmap.o: jogmap.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++jtr.o: jtr.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h +-kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++kml.o: kml.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h grtcirc.h \ + src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h +-lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++lmx.o: lmx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h ++lowranceusr.o: lowranceusr.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h + mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ + mac/libusb/usb.h mac/libusb/error.h + mac/libusb/descriptors.o: mac/libusb/descriptors.c mac/libusb/usbi.h \ +@@ -783,261 +779,233 @@ mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ + mac/libusb/error.h + mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ + mac/libusb/error.h +-maggeo.o: maggeo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++maggeo.o: maggeo.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + xmlgeneric.h magellan.h +-magproto.o: magproto.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++magproto.o: magproto.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h magellan.h \ + gbser.h explorist_ini.h +-main.o: main.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++main.o: main.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h cet_util.h \ + csv_util.h src/core/usasciicodec.h +-mapasia.o: mapasia.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapasia.o: mapasia.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-mapbar_track.o: mapbar_track.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-mapfactor.o: mapfactor.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++mapfactor.o: mapfactor.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/file.h src/core/xmlstreamwriter.h +-mapsend.o: mapsend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mapsend.o: mapsend.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h mapsend.h \ + magellan.h +-mapsource.o: mapsource.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mapsource.o: mapsource.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-mkshort.o: mkshort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mkshort.o: mkshort.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h +-mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++mmo.o: mmo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-mtk_locus.o: mtk_locus.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbser.h +-mynav.o: mynav.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++mynav.o: mynav.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-navicache.o: navicache.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++navicache.o: navicache.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++naviguide.o: naviguide.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navilink.o: navilink.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++navitel.o: navitel.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-netstumbler.o: netstumbler.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++netstumbler.o: netstumbler.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h +-nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmea.o: nmea.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h gbser.h \ + strptime.h jeeps/gpsmath.h jeeps/gpsport.h +-nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++nmn4.o: nmn4.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h +-nukedata.o: nukedata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++nukedata.o: nukedata.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++osm.o: osm.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++ozi.o: ozi.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-parse.o: parse.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++parse.o: parse.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h strptime.h +-pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++pcx.o: pcx.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + cet_util.h csv_util.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h +-polygon.o: polygon.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++polygon.o: polygon.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-position.o: position.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++position.o: position.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-psitrex.o: psitrex.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++psitrex.o: psitrex.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h + queue.o: queue.cc queue.h +-radius.o: radius.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++radius.o: radius.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-random.o: random.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++random.o: random.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_fs.h \ + jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h +-raymarine.o: raymarine.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++raymarine.o: raymarine.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++reverse_route.o: reverse_route.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-rgbcolors.o: rgbcolors.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-route.o: route.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++route.o: route.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-saroute.o: saroute.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++saroute.o: saroute.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbn.o: sbn.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h navilink.h +-sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sbp.o: sbp.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h navilink.h +-session.o: session.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++session.o: session.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-shape.o: shape.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++shape.o: shape.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skyforce.o: skyforce.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-skytraq.o: skytraq.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++skytraq.o: skytraq.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +-smplrout.o: smplrout.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++smplrout.o: smplrout.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + grtcirc.h +-sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++sort.o: sort.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h filterdefs.h + src/core/usasciicodec.o: src/core/usasciicodec.cc src/core/usasciicodec.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++stackfilter.o: stackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-stmsdf.o: stmsdf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmsdf.o: stmsdf.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h +-stmwpp.o: stmwpp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++stmwpp.o: stmwpp.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + cet_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++subrip.o: subrip.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-swapdata.o: swapdata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++swapdata.o: swapdata.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-tef_xml.o: tef_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tef_xml.o: tef_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++teletype.o: teletype.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++text.o: text.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tiger.o: tiger.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h +-tmpro.o: tmpro.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tmpro.o: tmpro.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h +-tomtom.o: tomtom.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++tomtom.o: tomtom.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpg.o: tpg.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++tpo.o: tpo.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++trackfilter.o: trackfilter.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h grtcirc.h strptime.h xmlgeneric.h +-transform.o: transform.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++transform.o: transform.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h +-unicsv.o: unicsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++unicsv.o: unicsv.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h +-units.o: units.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++units.o: units.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++util.o: util.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h src/core/xmltag.h \ + jeeps/gpsmath.h jeeps/gpsport.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++v900.o: v900.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-validate.o: validate.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++validate.o: validate.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h +-vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vcf.o: vcf.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vecs.o: vecs.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h csv_util.h gbversion.h +-vidaone.o: vidaone.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vidaone.o: vidaone.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-vitosmt.o: vitosmt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitosmt.o: vitosmt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++vitovtt.o: vitovtt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +-vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++vpl.o: vpl.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h +-waypt.o: waypt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++waypt.o: waypt.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + grtcirc.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + src/core/logging.h +-wbt-200.o: wbt-200.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wbt-200.o: wbt-200.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +-xcsv.o: xcsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h ++xcsv.o: xcsv.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h + xhtmlent.o: xhtmlent.cc +-xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h zlib/zlib.h \ +- zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h \ ++ gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h cet_util.h src/core/file.h +-xmltag.o: xmltag.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++xmltag.o: xmltag.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + src/core/xmltag.h +-xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ ++xol.o: xol.cc defs.h config.h queue.h gbfile.h \ + cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ + jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h +-yahoo.o: yahoo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ ++yahoo.o: yahoo.cc defs.h config.h queue.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) +diff --git a/configure.in b/configure.in +index ffa67430..b0e84c42 100644 +--- a/configure.in ++++ b/configure.in +@@ -402,7 +402,7 @@ AC_SUBST(QT_INC_OPT) + AC_SUBST(QT_SYSINC_OPT) + AC_SUBST(QT_LIBS) + +-AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile zlib/empty]) ++AC_CONFIG_FILES([Makefile gbversion.h gui/setup.iss xmldoc/makedoc tools/mkcapabilities win32/gpsbabel.rc jeeps/Makefile shapelib/Makefile]) + AC_CONFIG_FILES([gui/makelinuxdist.sh], [chmod +x gui/makelinuxdist.sh]) + AC_OUTPUT + +diff --git a/gui/makelinuxdist.sh.in b/gui/makelinuxdist.sh.in +index 72707f7a..8176d457 100644 +--- a/gui/makelinuxdist.sh.in ++++ b/gui/makelinuxdist.sh.in +@@ -7,32 +7,9 @@ DISTNAME=GPSBabel@PACKAGE_VERSION@@PACKAGE_RELEASE@ + DISTDIR=$DISTNAME + rm -rf $DISTDIR + mkdir $DISTDIR +-mkdir $DISTDIR/plugins + mkdir $DISTDIR/translations + mkdir $DISTDIR/help + +-QT_LIBS=`ldd objects/gpsbabelfe-bin | grep libQt | awk '{print $3}'` +-for lib in $QT_LIBS +-do +- cp $lib $DISTDIR +-done +-#cp `ldd objects/gpsbabelfe-bin | grep libphonon |awk '{print $3}'` $DISTDIR +-#cp `ldd objects/gpsbabelfe-bin | grep libaudio |awk '{print $3}'` $DISTDIR +- +-cp -r $QT_INSTALL_PLUGINS/imageformats $DISTDIR/plugins +-if [ -e $QT_INSTALL_PLUGINS/codecs ] +-then +- cp -r $QT_INSTALL_PLUGINS/codecs $DISTDIR/plugins +-else +- echo "Warning: $QT_INSTALL_PLUGINS/codecs not found, perhaps this is normal for Qt5" +-fi +-if [ -e $QT_INSTALL_PLUGINS/platforms ] +-then +-# we need at least platforms/libqxcb.so +- cp -r $QT_INSTALL_PLUGINS/platforms $DISTDIR/plugins +-else +- echo "Wanring: $QT_INSTALL_PLUGINS/platforms not found, this is normal for Qt4" +-fi + cp $QT_INSTALL_TRANSLATIONS/qt_*.qm $DISTDIR/translations/ + + # copy the compiled translations +@@ -40,10 +17,7 @@ cp *.qm $DISTDIR/translations + + # Now our gui + cp gmapbase.html $DISTDIR/ +-cp gpsbabelfe $DISTDIR/ +-chmod +x $DISTDIR/gpsbabelfe +-cp objects/gpsbabelfe-bin $DISTDIR +-cp qt.conf $DISTDIR/ ++cp objects/gpsbabelfe-bin $DISTDIR/gpsbabelfe + cp ../gpsbabel $DISTDIR/ + # + cp -r help/*.html $DISTDIR/help +@@ -53,7 +27,3 @@ cp ../COPYING $DISTDIR/ + cp ../README* $DISTDIR/ + + +-rm -f $DISTDIR.tar $DISTDIR.tar.bz2 +-tar cvf $DISTDIR.tar $DISTDIR +-bzip2 $DISTDIR.tar +- +diff --git a/tef_xml.cc b/tef_xml.cc +index b32d69b3..38142961 100644 +--- a/tef_xml.cc ++++ b/tef_xml.cc +@@ -72,11 +72,11 @@ tef_start(xg_string args, const QXmlStreamAttributes* attrv) + bool valid = false; + + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Comment", Qt::CaseInsensitive) == 0) { +- if (attr.value().compare("TourExchangeFormat", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Comment"), Qt::CaseInsensitive) == 0) { ++ if (attr.value().compare(QLatin1String("TourExchangeFormat"), Qt::CaseInsensitive) == 0) { + valid = true; + } +- } else if (attr.name().compare("Version", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Version"), Qt::CaseInsensitive) == 0) { + version = attr.value().toString().toDouble(); + } + } +@@ -95,9 +95,9 @@ tef_header(xg_string args, const QXmlStreamAttributes* attrv) + { + route = route_head_alloc(); + foreach(QXmlStreamAttribute attr, *attrv) { +- if (attr.name().compare("Name", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("Name"), Qt::CaseInsensitive) == 0) { + route->rte_name = attr.value().toString().trimmed(); +- } else if (attr.name().compare("Software", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Software"), Qt::CaseInsensitive) == 0) { + route->rte_desc = attr.value().toString().trimmed(); + } + } +@@ -248,20 +248,20 @@ tef_item_start(xg_string args, const QXmlStreamAttributes* attrv) + QString attrstr = attr.value().toString(); + QByteArray attrtext = attrstr.toUtf8(); + +- if (attr.name().compare("SegDescription", Qt::CaseInsensitive) == 0) { ++ if (attr.name().compare(QLatin1String("SegDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->shortname = attrstr.trimmed(); +- } else if (attr.name().compare("PointDescription", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("PointDescription"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("ViaStation", Qt::CaseInsensitive) == 0 && +- attr.value().compare("true", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("ViaStation"), Qt::CaseInsensitive) == 0 && ++ attr.value().compare(QLatin1String("true"), Qt::CaseInsensitive) == 0) { + wpt_tmp->wpt_flags.fmt_use = 1; /* only a flag */ + + /* new in TEF V2 */ +- } else if (attr.name().compare("Instruction", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Instruction"), Qt::CaseInsensitive) == 0) { + wpt_tmp->description = attrstr.trimmed(); +- } else if (attr.name().compare("Altitude", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("Altitude"), Qt::CaseInsensitive) == 0) { + wpt_tmp->altitude = attrstr.toDouble(); +- } else if (attr.name().compare("TimeStamp", Qt::CaseInsensitive) == 0) { ++ } else if (attr.name().compare(QLatin1String("TimeStamp"), Qt::CaseInsensitive) == 0) { + /* nothing for the moment */ + } + } diff --git a/tools/archive_images/gpsbabel_1_6_0.patch b/tools/archive_images/gpsbabel_1_6_0.patch new file mode 100644 index 000000000..1d9823726 --- /dev/null +++ b/tools/archive_images/gpsbabel_1_6_0.patch @@ -0,0 +1,843 @@ +diff --git a/Makefile.in b/Makefile.in +index 6f219438..52337c12 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -422,115 +422,115 @@ toolinfo: + -$(QMAKE) -v + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++alan.o: alan.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h +-an1.o: an1.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++an1.o: an1.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h an1sym.h +-arcdist.o: arcdist.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++arcdist.o: arcdist.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + arcdist.h filter.h filterdefs.h grtcirc.h +-bcr.o: bcr.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++bcr.o: bcr.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h csv_util.h \ + garmin_tables.h +-bend.o: bend.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++bend.o: bend.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h bend.h grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h +-bushnell.o: bushnell.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++bushnell.o: bushnell.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-cet.o: cet.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++cet.o: cet.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h +-cet_util.o: cet_util.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++cet_util.o: cet_util.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h src/core/logging.h cet/ansi_x3_4_1968.h cet/cp1252.h \ + cet/iso_8859_8.h +-compegps.o: compegps.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++compegps.o: compegps.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++cst.o: cst.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h +-csv_util.o: csv_util.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++csv_util.o: csv_util.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h src/core/logging.h +-delgpl.o: delgpl.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++delgpl.o: delgpl.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-destinator.o: destinator.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++destinator.o: destinator.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + strptime.h +-dg-100.o: dg-100.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++dg-100.o: dg-100.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h +-discard.o: discard.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++discard.o: discard.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + discard.h filter.h filterdefs.h +-dmtlog.o: dmtlog.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++dmtlog.o: dmtlog.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++duplicate.o: duplicate.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h duplicate.h +-easygps.o: easygps.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++easygps.o: easygps.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-energympro.o: energympro.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++energympro.o: energympro.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-enigma.o: enigma.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++enigma.o: enigma.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-exif.o: exif.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++exif.o: exif.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h cet.h inifile.h gbfile.h session.h src/core/datetime.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h \ ++ cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h explorist_ini.h +-f90g_track.o: f90g_track.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++f90g_track.o: f90g_track.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-fatal.o: fatal.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++fatal.o: fatal.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-filter_vecs.o: filter_vecs.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h arcdist.h filter.h bend.h discard.h duplicate.h \ + filterdefs.h height.h interpolate.h nukedata.h polygon.h position.h \ + radius.h reverse_route.h smplrout.h sort.h stackfilter.h swapdata.h \ + trackfilter.h transform.h validate.h gbversion.h +-formspec.o: formspec.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++formspec.o: formspec.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-g7towin.o: g7towin.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++g7towin.o: g7towin.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++garmin.o: garmin.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h garmin_device_xml.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + garmin_tables.h grtcirc.h jeeps/gpsserial.h +-garmin_device_xml.o: garmin_device_xml.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h cet.h inifile.h gbfile.h session.h src/core/datetime.h \ ++garmin_device_xml.o: garmin_device_xml.cc defs.h config.h \ ++ cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h garmin_device_xml.h xmlgeneric.h +-garmin_fit.o: garmin_fit.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-garmin_fs.o: garmin_fs.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++garmin_fs.o: garmin_fs.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h garmin_gpi.h cet_util.h garmin_fs.h jeeps/gps.h \ + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ +@@ -538,246 +538,246 @@ garmin_gpi.o: garmin_gpi.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h + garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h session.h \ ++ cet.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/logging.h +-garmin_txt.o: garmin_txt.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h csv_util.h garmin_fs.h jeeps/gps.h \ + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h garmin_tables.h grtcirc.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-gbfile.o: gbfile.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gbfile.o: gbfile.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/logging.h +-gbser.o: gbser.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gbser.o: gbser.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h gbser_private.h +-gdb.o: gdb.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++gdb.o: gdb.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h garmin_tables.h \ + grtcirc.h +-geo.o: geo.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++geo.o: geo.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h +-geojson.o: geojson.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++geojson.o: geojson.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h +-ggv_bin.o: ggv_bin.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++ggv_bin.o: ggv_bin.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-ggv_log.o: ggv_log.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++ggv_log.o: ggv_log.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++globals.o: globals.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbversion.h +-globalsat_sport.o: globalsat_sport.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h cet.h inifile.h gbfile.h session.h src/core/datetime.h \ ++globalsat_sport.o: globalsat_sport.cc defs.h config.h \ ++ cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h +-glogbook.o: glogbook.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++glogbook.o: glogbook.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h xmlgeneric.h +-gnav_trl.o: gnav_trl.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-googledir.o: googledir.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++googledir.o: googledir.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gopal.o: gopal.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h \ + strptime.h +-gpssim.o: gpssim.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gpssim.o: gpssim.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-gpsutil.o: gpsutil.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gpsutil.o: gpsutil.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h magellan.h +-gpx.o: gpx.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++gpx.o: gpx.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h garmin_fs.h \ + jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h jeeps/gpsdevice.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h garmin_tables.h src/core/file.h \ + src/core/logging.h src/core/xmlstreamwriter.h src/core/xmltag.h +-grtcirc.o: grtcirc.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++grtcirc.o: grtcirc.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-gtm.o: gtm.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++gtm.o: gtm.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-height.o: height.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++height.o: height.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h height.h heightgrid.h +-hiketech.o: hiketech.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++hiketech.o: hiketech.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/xmlstreamwriter.h xmlgeneric.h +-holux.o: holux.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++holux.o: holux.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + holux.h +-html.o: html.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++html.o: html.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++humminbird.o: humminbird.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-igc.o: igc.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++igc.o: igc.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h +-ignrando.o: ignrando.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++ignrando.o: ignrando.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++igo8.o: igo8.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h +-ik3d.o: ik3d.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++ik3d.o: ik3d.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++inifile.o: inifile.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h +-internal_styles.o: internal_styles.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h cet.h inifile.h gbfile.h session.h src/core/datetime.h \ ++internal_styles.o: internal_styles.cc defs.h config.h \ ++ cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-interpolate.o: interpolate.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++interpolate.o: interpolate.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h filterdefs.h filter.h interpolate.h grtcirc.h +-itracku.o: itracku.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++itracku.o: itracku.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsserial.h jeeps/gpsusbint.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h \ ++ config.h cet.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h \ ++ config.h cet.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h \ ++ config.h cet.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsusbcommon.h jeeps/gpsusbint.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ +- jeeps/gps.h jeeps/../defs.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++ jeeps/gps.h jeeps/../defs.h cet.h inifile.h \ + gbfile.h defs.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/garminusb.h jeeps/gpsusbcommon.h jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h \ ++ config.h cet.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/../gbser.h \ + jeeps/gpsserial.h gbser_posix.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h \ ++ config.h cet.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/garminusb.h \ +- jeeps/gpsdevice.h jeeps/gps.h jeeps/../defs.h config.h zlib/zlib.h \ +- zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ jeeps/gpsdevice.h jeeps/gps.h jeeps/../defs.h config.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h \ ++ config.h cet.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h cet.h inifile.h gbfile.h defs.h session.h \ ++ cet.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h +-jogmap.o: jogmap.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++jogmap.o: jogmap.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-jtr.o: jtr.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++jtr.o: jtr.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h csv_util.h +-kml.o: kml.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++kml.o: kml.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h grtcirc.h \ + src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h \ + xmlgeneric.h +-lmx.o: lmx.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++lmx.o: lmx.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++lowranceusr.o: lowranceusr.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h + mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ +@@ -788,294 +788,261 @@ mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ + mac/libusb/error.h + mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ + mac/libusb/error.h +-maggeo.o: maggeo.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++maggeo.o: maggeo.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h magellan.h xmlgeneric.h +-magproto.o: magproto.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++magproto.o: magproto.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + explorist_ini.h gbser.h magellan.h +-main.o: main.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++main.o: main.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h \ + csv_util.h filter.h filterdefs.h src/core/file.h \ + src/core/usasciicodec.h +-mapasia.o: mapasia.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mapasia.o: mapasia.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-mapbar_track.o: mapbar_track.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-mapfactor.o: mapfactor.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mapfactor.o: mapfactor.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h src/core/xmlstreamwriter.h +-mapsend.o: mapsend.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mapsend.o: mapsend.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + mapsend.h magellan.h +-mapsource.o: mapsource.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mapsource.o: mapsource.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-mkshort.o: mkshort.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mkshort.o: mkshort.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h +-mmo.o: mmo.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++mmo.o: mmo.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h +-mtk_locus.o: mtk_locus.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h +-mynav.o: mynav.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++mynav.o: mynav.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-navicache.o: navicache.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++navicache.o: navicache.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++naviguide.o: naviguide.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++navilink.o: navilink.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++navitel.o: navitel.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-netstumbler.o: netstumbler.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++netstumbler.o: netstumbler.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h csv_util.h +-nmea.o: nmea.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++nmea.o: nmea.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h \ + gbser.h jeeps/gpsmath.h jeeps/gpsport.h src/core/logging.h strptime.h +-nmn4.o: nmn4.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++nmn4.o: nmn4.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h \ + csv_util.h +-nukedata.o: nukedata.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++nukedata.o: nukedata.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h nukedata.h +-osm.o: osm.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++osm.o: osm.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++ozi.o: ozi.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h csv_util.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/textstream.h src/core/file.h +-parse.o: parse.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++parse.o: parse.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-pcx.o: pcx.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++pcx.o: pcx.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h cet_util.h \ + csv_util.h garmin_tables.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h csv_util.h +-polygon.o: polygon.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++polygon.o: polygon.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h polygon.h +-position.o: position.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++position.o: position.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h grtcirc.h position.h +-psitrex.o: psitrex.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++psitrex.o: psitrex.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h +-radius.o: radius.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++radius.o: radius.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h radius.h grtcirc.h +-random.o: random.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++random.o: random.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h +-raymarine.o: raymarine.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++raymarine.o: raymarine.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h cet.h inifile.h gbfile.h session.h src/core/datetime.h \ ++reverse_route.o: reverse_route.cc defs.h config.h \ ++ cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h filterdefs.h filter.h reverse_route.h +-rgbcolors.o: rgbcolors.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-route.o: route.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++route.o: route.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-saroute.o: saroute.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++saroute.o: saroute.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-sbn.o: sbn.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++sbn.o: sbn.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h navilink.h +-sbp.o: sbp.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++sbp.o: sbp.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h navilink.h +-session.o: session.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++session.o: session.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-shape.o: shape.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++shape.o: shape.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++skyforce.o: skyforce.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-skytraq.o: skytraq.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++skytraq.o: skytraq.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h +-smplrout.o: smplrout.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++smplrout.o: smplrout.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h grtcirc.h smplrout.h +-sort.o: sort.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++sort.o: sort.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h sort.h + src/core/textstream.o: src/core/textstream.cc src/core/textstream.h \ +- src/core/file.h defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++ src/core/file.h defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h + src/core/usasciicodec.o: src/core/usasciicodec.cc src/core/usasciicodec.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++stackfilter.o: stackfilter.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h filterdefs.h filter.h stackfilter.h +-stmsdf.o: stmsdf.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++stmsdf.o: stmsdf.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h \ + src/core/logging.h +-stmwpp.o: stmwpp.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++stmwpp.o: stmwpp.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h cet_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++subrip.o: subrip.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-swapdata.o: swapdata.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++swapdata.o: swapdata.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h swapdata.h +-tef_xml.o: tef_xml.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++tef_xml.o: tef_xml.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++teletype.o: teletype.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-text.o: text.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++text.o: text.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++tiger.o: tiger.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h +-tmpro.o: tmpro.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++tmpro.o: tmpro.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h +-tomtom.o: tomtom.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++tomtom.o: tomtom.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-tpg.o: tpg.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++tpg.o: tpg.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++tpo.o: tpo.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++trackfilter.o: trackfilter.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h filterdefs.h filter.h trackfilter.h grtcirc.h +-transform.o: transform.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++transform.o: transform.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h transform.h +-unicsv.o: unicsv.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++unicsv.o: unicsv.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h garmin_tables.h \ + src/core/logging.h src/core/textstream.h src/core/file.h +-units.o: units.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++units.o: units.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-util.o: util.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++util.o: util.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/xmltag.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++v900.o: v900.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h +-validate.o: validate.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++validate.o: validate.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + filterdefs.h filter.h validate.h +-vcf.o: vcf.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++vcf.o: vcf.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++vecs.o: vecs.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h csv_util.h \ + gbversion.h xcsv.h src/core/file.h +-vidaone.o: vidaone.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++vidaone.o: vidaone.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-vitosmt.o: vitosmt.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++vitosmt.o: vitosmt.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++vitovtt.o: vitovtt.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-vpl.o: vpl.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++vpl.o: vpl.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h +-waypt.o: waypt.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++waypt.o: waypt.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h grtcirc.h \ + src/core/logging.h +-wbt-200.o: wbt-200.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++wbt-200.o: wbt-200.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-xcsv.o: xcsv.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++xcsv.o: xcsv.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h grtcirc.h \ + src/core/file.h src/core/logging.h strptime.h xcsv.h xcsv_tokens.gperf +-xmlgeneric.o: xmlgeneric.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h \ + cet.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h src/core/file.h xmlgeneric.h +-xmltag.o: xmltag.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++xmltag.o: xmltag.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h src/core/xmltag.h +-xol.o: xol.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h inifile.h \ ++xol.o: xol.cc defs.h config.h cet.h inifile.h \ + gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h src/core/file.h \ + src/core/xmlstreamwriter.h xmlgeneric.h +-yahoo.o: yahoo.cc defs.h config.h zlib/zlib.h zlib/zconf.h cet.h \ ++yahoo.o: yahoo.cc defs.h config.h cet.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/contrib/minizip/ioapi.o: zlib/contrib/minizip/ioapi.c \ +- zlib/contrib/minizip/ioapi.h zlib/zlib.h zlib/zconf.h config.h +-zlib/contrib/minizip/zip.o: zlib/contrib/minizip/zip.c zlib/zlib.h \ +- zlib/zconf.h config.h zlib/contrib/minizip/zip.h \ +- zlib/contrib/minizip/ioapi.h zlib/contrib/minizip/crypt.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) diff --git a/tools/archive_images/gpsbabel_1_7_0.patch b/tools/archive_images/gpsbabel_1_7_0.patch new file mode 100644 index 000000000..e0d751c9d --- /dev/null +++ b/tools/archive_images/gpsbabel_1_7_0.patch @@ -0,0 +1,882 @@ +diff --git a/Makefile.in b/Makefile.in +index 5ace8da1..60c6bbb4 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -424,86 +424,86 @@ mac/libusb/libusb-1.0.a: + cd mac/libusb; $(QMAKE) @abs_srcdir@/mac/libusb/libusb.pro && $(MAKE) + + # Machine generated from here down. +-alan.o: alan.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++alan.o: alan.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-an1.o: an1.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++an1.o: an1.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + an1sym.h +-arcdist.o: arcdist.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++arcdist.o: arcdist.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + arcdist.h filter.h grtcirc.h src/core/logging.h +-bcr.o: bcr.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++bcr.o: bcr.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h garmin_tables.h +-bend.o: bend.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++bend.o: bend.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + bend.h filter.h grtcirc.h +-brauniger_iq.o: brauniger_iq.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++brauniger_iq.o: brauniger_iq.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h +-bushnell.o: bushnell.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++bushnell.o: bushnell.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-bushnell_trl.o: bushnell_trl.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++bushnell_trl.o: bushnell_trl.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-cet.o: cet.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++cet.o: cet.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet.h +-cet_util.o: cet_util.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++cet_util.o: cet_util.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h src/core/logging.h +-compegps.o: compegps.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++compegps.o: compegps.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h csv_util.h jeeps/gpsmath.h \ + jeeps/gpsport.h +-cst.o: cst.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++cst.o: cst.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h +-csv_util.o: csv_util.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++csv_util.o: csv_util.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h csv_util.h src/core/logging.h +-delgpl.o: delgpl.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++delgpl.o: delgpl.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-destinator.o: destinator.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++destinator.o: destinator.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + strptime.h +-dg-100.o: dg-100.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++dg-100.o: dg-100.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + dg-100.h format.h gbser.h +-discard.o: discard.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++discard.o: discard.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + discard.h filter.h +-dmtlog.o: dmtlog.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++dmtlog.o: dmtlog.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-duplicate.o: duplicate.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++duplicate.o: duplicate.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h duplicate.h filter.h +-easygps.o: easygps.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++easygps.o: easygps.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-energympro.o: energympro.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++energympro.o: energympro.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h energympro.h format.h +-enigma.o: enigma.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++enigma.o: enigma.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-exif.o: exif.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++exif.o: exif.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h +-explorist_ini.o: explorist_ini.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++explorist_ini.o: explorist_ini.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h explorist_ini.h +-f90g_track.o: f90g_track.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++f90g_track.o: f90g_track.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-fatal.o: fatal.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++fatal.o: fatal.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/logging.h +-filter_vecs.o: filter_vecs.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++filter_vecs.o: filter_vecs.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h filter_vecs.h arcdist.h filter.h bend.h discard.h \ + duplicate.h height.h heightgrid.h interpolate.h nukedata.h polygon.h \ +@@ -518,17 +518,17 @@ filter_vecs.o: filter_vecs.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h yahoo.h +-formspec.o: formspec.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++formspec.o: formspec.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-g7towin.o: g7towin.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++g7towin.o: g7towin.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + garmin_tables.h strptime.h +-garmin.o: garmin.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++garmin.o: garmin.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h format.h garmin_device_xml.h garmin_fs.h jeeps/gps.h \ + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ +@@ -540,101 +540,101 @@ garmin.o: garmin.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ + kml.h xmlgeneric.h legacyformat.h lowranceusr.h mynav.h nmea.h osm.h \ + qstarz_bl_1000.h random.h shape.h shapelib/shapefil.h subrip.h \ + unicsv.h src/core/textstream.h xcsv.h yahoo.h +-garmin_device_xml.o: garmin_device_xml.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++garmin_device_xml.o: garmin_device_xml.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h garmin_device_xml.h \ + xmlgeneric.h +-garmin_fit.o: garmin_fit.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_fit.o: garmin_fit.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h garmin_fit.h format.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/logging.h +-garmin_fs.o: garmin_fs.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_fs.o: garmin_fs.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + garmin_tables.h +-garmin_gpi.o: garmin_gpi.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_gpi.o: garmin_gpi.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h garmin_gpi.h cet_util.h garmin_fs.h jeeps/gps.h \ + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h +-garmin_tables.o: garmin_tables.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++garmin_tables.o: garmin_tables.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/logging.h \ + garmin_icon_tables.h +-garmin_txt.o: garmin_txt.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_txt.o: garmin_txt.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + garmin_tables.h src/core/textstream.h src/core/file.h strptime.h +-garmin_xt.o: garmin_xt.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++garmin_xt.o: garmin_xt.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-gbfile.o: gbfile.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gbfile.o: gbfile.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/logging.h cet.h +-gbser.o: gbser.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gbser.o: gbser.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h gbser_private.h +-gbser_posix.o: gbser_posix.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++gbser_posix.o: gbser_posix.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h gbser_private.h +-gdb.o: gdb.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gdb.o: gdb.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h garmin_tables.h \ + grtcirc.h +-geo.o: geo.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++geo.o: geo.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h +-geojson.o: geojson.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++geojson.o: geojson.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + geojson.h format.h src/core/file.h src/core/logging.h +-ggv_bin.o: ggv_bin.cc ggv_bin.h defs.h config.h zlib/zlib.h zlib/zconf.h \ ++ggv_bin.o: ggv_bin.cc ggv_bin.h defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h format.h +-ggv_log.o: ggv_log.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++ggv_log.o: ggv_log.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-ggv_ovl.o: ggv_ovl.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++ggv_ovl.o: ggv_ovl.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-globals.o: globals.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++globals.o: globals.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbversion.h +-globalsat_sport.o: globalsat_sport.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++globalsat_sport.o: globalsat_sport.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h globalsat_sport.h format.h \ + gbser.h +-glogbook.o: glogbook.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++glogbook.o: glogbook.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h src/core/file.h xmlgeneric.h +-gnav_trl.o: gnav_trl.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++gnav_trl.o: gnav_trl.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-googledir.o: googledir.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++googledir.o: googledir.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h xmlgeneric.h +-gopal.o: gopal.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gopal.o: gopal.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h \ + strptime.h +-gpssim.o: gpssim.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gpssim.o: gpssim.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + nmea.h format.h +-gpsutil.o: gpsutil.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gpsutil.o: gpsutil.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h magellan.h +-gpx.o: gpx.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gpx.o: gpx.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gpx.h format.h src/core/file.h src/core/xmlstreamwriter.h \ + src/core/xmltag.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ +@@ -642,88 +642,88 @@ gpx.o: gpx.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + garmin_tables.h src/core/logging.h +-grtcirc.o: grtcirc.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++grtcirc.o: grtcirc.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-gtm.o: gtm.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gtm.o: gtm.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-gtrnctr.o: gtrnctr.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++gtrnctr.o: gtrnctr.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-height.o: height.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++height.o: height.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + height.h filter.h heightgrid.h +-hiketech.o: hiketech.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++hiketech.o: hiketech.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h src/core/xmlstreamwriter.h xmlgeneric.h +-holux.o: holux.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++holux.o: holux.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + holux.h +-html.o: html.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++html.o: html.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-humminbird.o: humminbird.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++humminbird.o: humminbird.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-igc.o: igc.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++igc.o: igc.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h +-ignrando.o: ignrando.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++ignrando.o: ignrando.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h xmlgeneric.h +-igo8.o: igo8.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++igo8.o: igo8.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-ik3d.o: ik3d.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++ik3d.o: ik3d.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-inifile.o: inifile.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++inifile.o: inifile.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/file.h +-internal_styles.o: internal_styles.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++internal_styles.o: internal_styles.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h +-interpolate.o: interpolate.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++interpolate.o: interpolate.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h interpolate.h filter.h grtcirc.h \ + src/core/logging.h +-itracku.o: itracku.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++itracku.o: itracku.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h + jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsserial.h jeeps/gpsusbint.h + jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ config.h formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ config.h formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ config.h formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsusbcommon.h jeeps/gpsusbint.h + jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/libusb.h \ +- jeeps/../defs.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h \ ++ jeeps/../defs.h formspec.h inifile.h gbfile.h \ + defs.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/garminusb.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpsport.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ +@@ -731,95 +731,95 @@ jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/libusb.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsusbcommon.h \ + jeeps/../garmin_device_xml.h + jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsdatum.h + jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h + jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsserial.h + jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ config.h formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/../gbser.h \ + jeeps/gpsserial.h gbser_posix.h + jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ config.h formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsusbcommon.h + jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/garminusb.h \ +- jeeps/gpsdevice.h jeeps/gps.h jeeps/../defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h defs.h session.h \ ++ jeeps/gpsdevice.h jeeps/gps.h jeeps/../defs.h config.h \ ++ formspec.h inifile.h gbfile.h defs.h session.h \ + src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsusbint.h + jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ +- config.h zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ config.h formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/garminusb.h \ + jeeps/gpsusbint.h + jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h defs.h \ ++ formspec.h inifile.h gbfile.h defs.h \ + session.h src/core/datetime.h src/core/optional.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h +-jogmap.o: jogmap.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++jogmap.o: jogmap.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +-jtr.o: jtr.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++jtr.o: jtr.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h nmea.h format.h +-kml.o: kml.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++kml.o: kml.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + kml.h format.h src/core/file.h src/core/xmlstreamwriter.h xmlgeneric.h \ + grtcirc.h src/core/logging.h src/core/xmltag.h units.h +-lmx.o: lmx.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++lmx.o: lmx.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-lowranceusr.o: lowranceusr.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++lowranceusr.o: lowranceusr.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h lowranceusr.h format.h src/core/logging.h +-maggeo.o: maggeo.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++maggeo.o: maggeo.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h magellan.h +-magproto.o: magproto.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++magproto.o: magproto.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h explorist_ini.h format.h gbser.h magellan.h vecs.h \ + dg-100.h energympro.h garmin_fit.h geojson.h src/core/file.h ggv_bin.h \ +@@ -831,7 +831,7 @@ magproto.o: magproto.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h yahoo.h +-main.o: main.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++main.o: main.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h filter.h filter_vecs.h arcdist.h bend.h \ + discard.h duplicate.h height.h heightgrid.h interpolate.h nukedata.h \ +@@ -846,191 +846,191 @@ main.o: main.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h yahoo.h +-mapasia.o: mapasia.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++mapasia.o: mapasia.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-mapbar_track.o: mapbar_track.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++mapbar_track.o: mapbar_track.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-mapfactor.o: mapfactor.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++mapfactor.o: mapfactor.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h src/core/file.h src/core/xmlstreamwriter.h +-mapsend.o: mapsend.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++mapsend.o: mapsend.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + mapsend.h magellan.h +-mkshort.o: mkshort.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++mkshort.o: mkshort.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet.h +-mmo.o: mmo.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++mmo.o: mmo.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-mtk_locus.o: mtk_locus.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++mtk_locus.o: mtk_locus.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h +-mtk_logger.o: mtk_logger.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++mtk_logger.o: mtk_logger.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h + mynav.o: mynav.cc src/core/textstream.h src/core/file.h defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h mynav.h format.h +-navicache.o: navicache.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++navicache.o: navicache.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h cet_util.h src/core/file.h +-naviguide.o: naviguide.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++naviguide.o: naviguide.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +-navilink.o: navilink.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++navilink.o: navilink.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h gbser.h jeeps/gpsmath.h jeeps/gpsport.h navilink.h +-navitel.o: navitel.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++navitel.o: navitel.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-netstumbler.o: netstumbler.cc cet_util.h defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++netstumbler.o: netstumbler.cc cet_util.h defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h csv_util.h +-nmea.o: nmea.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++nmea.o: nmea.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + nmea.h format.h cet_util.h gbser.h jeeps/gpsmath.h jeeps/gpsport.h \ + src/core/logging.h strptime.h +-nmn4.o: nmn4.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++nmn4.o: nmn4.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h +-nukedata.o: nukedata.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++nukedata.o: nukedata.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h nukedata.h filter.h +-osm.o: osm.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++osm.o: osm.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + osm.h format.h xmlgeneric.h +-ozi.o: ozi.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++ozi.o: ozi.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h src/core/textstream.h \ + src/core/file.h +-parse.o: parse.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++parse.o: parse.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-pcx.o: pcx.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++pcx.o: pcx.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h garmin_tables.h +-pocketfms_bc.o: pocketfms_bc.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++pocketfms_bc.o: pocketfms_bc.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-pocketfms_fp.o: pocketfms_fp.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++pocketfms_fp.o: pocketfms_fp.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h xmlgeneric.h +-pocketfms_wp.o: pocketfms_wp.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++pocketfms_wp.o: pocketfms_wp.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h csv_util.h +-polygon.o: polygon.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++polygon.o: polygon.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + polygon.h filter.h +-position.o: position.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++position.o: position.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h grtcirc.h position.h filter.h + qstarz_bl_1000.o: qstarz_bl_1000.cc qstarz_bl_1000.h defs.h config.h \ +- zlib/zlib.h zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h format.h src/core/logging.h +-radius.o: radius.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++radius.o: radius.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + radius.h filter.h grtcirc.h +-random.o: random.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++random.o: random.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + random.h format.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h +-raymarine.o: raymarine.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++raymarine.o: raymarine.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h csv_util.h +-reverse_route.o: reverse_route.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++reverse_route.o: reverse_route.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h reverse_route.h filter.h +-rgbcolors.o: rgbcolors.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++rgbcolors.o: rgbcolors.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-route.o: route.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++route.o: route.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-saroute.o: saroute.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++saroute.o: saroute.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-sbn.o: sbn.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++sbn.o: sbn.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + navilink.h +-sbp.o: sbp.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++sbp.o: sbp.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + navilink.h +-session.o: session.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++session.o: session.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-shape.o: shape.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++shape.o: shape.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + shape.h format.h shapelib/shapefil.h + shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h + shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h + shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h +-skyforce.o: skyforce.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++skyforce.o: skyforce.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-skytraq.o: skytraq.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++skytraq.o: skytraq.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h +-smplrout.o: smplrout.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++smplrout.o: smplrout.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h smplrout.h filter.h grtcirc.h +-sort.o: sort.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++sort.o: sort.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + sort.h filter.h +-src/core/textstream.o: src/core/textstream.cc defs.h config.h zlib/zlib.h \ +- zlib/zconf.h formspec.h inifile.h gbfile.h session.h \ ++src/core/textstream.o: src/core/textstream.cc defs.h config.h \ ++ formspec.h inifile.h gbfile.h session.h \ + src/core/datetime.h src/core/optional.h src/core/textstream.h \ + src/core/file.h + src/core/usasciicodec.o: src/core/usasciicodec.cc src/core/usasciicodec.h + src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ + src/core/xmlstreamwriter.h +-stackfilter.o: stackfilter.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++stackfilter.o: stackfilter.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h stackfilter.h filter.h +-stmsdf.o: stmsdf.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++stmsdf.o: stmsdf.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h \ + src/core/logging.h +-stmwpp.o: stmwpp.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++stmwpp.o: stmwpp.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h + strptime.o: strptime.c config.h strptime.h +-subrip.o: subrip.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++subrip.o: subrip.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + subrip.h format.h src/core/logging.h +-swapdata.o: swapdata.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++swapdata.o: swapdata.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h swapdata.h filter.h +-tef_xml.o: tef_xml.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++tef_xml.o: tef_xml.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + xmlgeneric.h +-teletype.o: teletype.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++teletype.o: teletype.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-text.o: text.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++text.o: text.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/xmltag.h +-tiger.o: tiger.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++tiger.o: tiger.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h +-tmpro.o: tmpro.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++tmpro.o: tmpro.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet_util.h csv_util.h +-tomtom.o: tomtom.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++tomtom.o: tomtom.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-tpg.o: tpg.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++tpg.o: tpg.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-tpo.o: tpo.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++tpo.o: tpo.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-trackfilter.o: trackfilter.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++trackfilter.o: trackfilter.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h trackfilter.h filter.h grtcirc.h +-transform.o: transform.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++transform.o: transform.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h transform.h filter.h +-unicsv.o: unicsv.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++unicsv.o: unicsv.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + unicsv.h format.h src/core/textstream.h src/core/file.h csv_util.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ +@@ -1038,22 +1038,22 @@ unicsv.o: unicsv.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h garmin_tables.h \ + src/core/logging.h +-units.o: units.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++units.o: units.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + units.h +-util.o: util.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++util.o: util.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + cet.h src/core/logging.h src/core/xmltag.h + util_crc.o: util_crc.cc +-v900.o: v900.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++v900.o: v900.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-validate.o: validate.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++validate.o: validate.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h validate.h filter.h +-vcf.o: vcf.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++vcf.o: vcf.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + jeeps/gpsmath.h jeeps/gpsport.h +-vecs.o: vecs.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++vecs.o: vecs.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + vecs.h dg-100.h format.h energympro.h garmin_fit.h geojson.h \ + src/core/file.h ggv_bin.h globalsat_sport.h gpx.h \ +@@ -1065,32 +1065,32 @@ vecs.o: vecs.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h yahoo.h \ + gbversion.h src/core/logging.h +-vidaone.o: vidaone.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++vidaone.o: vidaone.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-vitosmt.o: vitosmt.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++vitosmt.o: vitosmt.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + grtcirc.h +-vitovtt.o: vitovtt.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++vitovtt.o: vitovtt.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-vpl.o: vpl.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++vpl.o: vpl.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h +-waypt.o: waypt.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++waypt.o: waypt.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h grtcirc.h \ + src/core/logging.h +-wbt-200.o: wbt-200.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++wbt-200.o: wbt-200.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + gbser.h grtcirc.h +-wfff_xml.o: wfff_xml.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++wfff_xml.o: wfff_xml.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h xmlgeneric.h +-wintec_tes.o: wintec_tes.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++wintec_tes.o: wintec_tes.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h +-xcsv.o: xcsv.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++xcsv.o: xcsv.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ +@@ -1098,46 +1098,18 @@ xcsv.o: xcsv.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h grtcirc.h \ + src/core/logging.h src/core/textstream.h src/core/file.h strptime.h \ + xcsv.h format.h xcsv_tokens.gperf +-xmlgeneric.o: xmlgeneric.cc defs.h config.h zlib/zlib.h zlib/zconf.h \ ++xmlgeneric.o: xmlgeneric.cc defs.h config.h \ + formspec.h inifile.h gbfile.h session.h src/core/datetime.h \ + src/core/optional.h xmlgeneric.h src/core/file.h +-xmltag.o: xmltag.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++xmltag.o: xmltag.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + src/core/xmltag.h +-xol.o: xol.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++xol.o: xol.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h src/core/file.h \ + src/core/xmlstreamwriter.h xmlgeneric.h +-yahoo.o: yahoo.cc defs.h config.h zlib/zlib.h zlib/zconf.h formspec.h \ ++yahoo.o: yahoo.cc defs.h config.h formspec.h \ + inifile.h gbfile.h session.h src/core/datetime.h src/core/optional.h \ + yahoo.h format.h xmlgeneric.h +-zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +-zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/crc32.h +-zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h +-zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ +- config.h +-zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h +-zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h +-zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ +- config.h zlib/inftrees.h +-zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ +- zlib/zconf.h config.h zlib/trees.h +-zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h +-zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ +- zlib/gzguts.h + internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style + $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) diff --git a/tools/archive_images/gpsbabel_dev.patch b/tools/archive_images/gpsbabel_dev.patch new file mode 100644 index 000000000..8db4723dd --- /dev/null +++ b/tools/archive_images/gpsbabel_dev.patch @@ -0,0 +1,13 @@ +diff --git a/gui/babeldata.h b/gui/babeldata.h +index 9adb4dcd..00392f64 100644 +--- a/gui/babeldata.h ++++ b/gui/babeldata.h +@@ -63,7 +63,7 @@ public: + upgradeErrors_(0), + upgradeOffers_(0), + runCount_(0), +- startupVersionCheck_(true), ++ startupVersionCheck_(false), + reportStatistics_(true), + allowBetaUpgrades_(false), + ignoreVersionMismatch_(false), diff --git a/tools/archive_images/make_docker_image_gpsbabel.sh b/tools/archive_images/make_docker_image_gpsbabel.sh new file mode 100755 index 000000000..3acfb66e8 --- /dev/null +++ b/tools/archive_images/make_docker_image_gpsbabel.sh @@ -0,0 +1,18 @@ +#!/bin/bash -ex +# you must be logged into docker for the push to succeed. + +versuffix=${1:+$1} # tag name must be lower case +TMPDIR=$(mktemp -d) + +cp "Dockerfile_gpsbabel_${versuffix}" "$TMPDIR" +cp setup_user.sh "$TMPDIR" +cp ./*.patch "$TMPDIR" + +docker build --pull --file "Dockerfile_gpsbabel_${versuffix}" \ + --tag "tsteven4/gpsbabel:${versuffix}" \ + --progress=plain \ + "$TMPDIR" + +/bin/rm -fr "$TMPDIR" +#docker push tsteven4/gpsbabel:latest +docker image ls diff --git a/tools/archive_images/push.sh b/tools/archive_images/push.sh new file mode 100755 index 000000000..e4081827f --- /dev/null +++ b/tools/archive_images/push.sh @@ -0,0 +1,12 @@ +#!/bin/bash -ex +docker push tsteven4/gpsbabel:1.5.0 +docker push tsteven4/gpsbabel:1.5.1 +docker push tsteven4/gpsbabel:1.5.2 +docker push tsteven4/gpsbabel:1.5.3 +docker push tsteven4/gpsbabel:1.5.4 +docker push tsteven4/gpsbabel:1.6.0 +docker push tsteven4/gpsbabel:1.7.0 +docker push tsteven4/gpsbabel:1.8.0 +docker push tsteven4/gpsbabel:1.9.0 +docker push tsteven4/gpsbabel:latest +docker push tsteven4/gpsbabel:dev diff --git a/tools/archive_images/rebuild.sh b/tools/archive_images/rebuild.sh new file mode 100755 index 000000000..41b7933e0 --- /dev/null +++ b/tools/archive_images/rebuild.sh @@ -0,0 +1,10 @@ +#!/bin/bash -ex +./make_docker_image_gpsbabel.sh 1.5.0 +./make_docker_image_gpsbabel.sh 1.5.1 +./make_docker_image_gpsbabel.sh 1.5.2 +./make_docker_image_gpsbabel.sh 1.5.3 +./make_docker_image_gpsbabel.sh 1.5.4 +./make_docker_image_gpsbabel.sh 1.6.0 +./make_docker_image_gpsbabel.sh 1.7.0 +./make_docker_image_gpsbabel.sh 1.8.0 +./make_docker_image_gpsbabel.sh 1.9.0 diff --git a/tools/archive_images/run_gpsbabel.sh b/tools/archive_images/run_gpsbabel.sh new file mode 100755 index 000000000..4c2691ed2 --- /dev/null +++ b/tools/archive_images/run_gpsbabel.sh @@ -0,0 +1,17 @@ +#!/bin/bash -e +VERSION=latest +while getopts "v:" opt; do + case $opt in + v) VERSION=$OPTARG;; + *) exit 1;; + esac +done +shift $((OPTIND -1)) + +container=$(docker create -q -i -t -w /app -v "$(pwd):/app" "tsteven4/gpsbabel:${VERSION}") +trap 'docker rm -f "${container}" >/dev/null' 0 1 2 3 15 +docker start "${container}" >/dev/null +docker exec -i -t "${container}" setup_user.sh "$(id -u)" "$(id -g)" +docker exec -i -t -u "$(id -u):$(id -g)" "${container}" gpsbabel "$@" + + diff --git a/tools/archive_images/run_gpsbabelfe.sh b/tools/archive_images/run_gpsbabelfe.sh new file mode 100755 index 000000000..31fd56b62 --- /dev/null +++ b/tools/archive_images/run_gpsbabelfe.sh @@ -0,0 +1,43 @@ +#!/bin/bash -e +VERSION=latest +while getopts "v:" opt; do + case $opt in + v) VERSION=$OPTARG;; + *) echo "Usage: $0 [-v tag]"; exit 1;; + esac +done +shift $((OPTIND -1)) + +# we use a persistent container so the gpsbabel GUI state is saved and restored (in the container). +container_name=tsteven4_gpsbabel_${VERSION} + +# if the container doesn't exist create it. +if [ -z "$(docker ps -a -q -f "name=^${container_name}$")" ]; then + if [ -n "$LANG" ]; then + OPTIONS+=(-e "LANG=$LANG") + fi + + docker container create -q -i -t \ + -e "DISPLAY=$DISPLAY" \ + "${OPTIONS[@]}" \ + --name "${container_name}" \ + --network=host \ + -v "$(pwd):/app" \ + -v "$HOME/.Xauthority:/root/.Xauthority" \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -w /app \ + "tsteven4/gpsbabel:${VERSION}" >/dev/null + + docker start "${container_name}" >/dev/null + +# make sure the users uid/gid exist in the container. + docker exec -i -t "${container_name}" setup_user.sh "$(id -u)" "$(id -g)" +fi + +# if necessary start the container. +if [ -z "$(docker ps -a -q -f "status=running" -f "name=^${container_name}$")" ]; then + docker start "${container_name}" >/dev/null +fi + +# run the gpsbabel GUI +docker exec -i -t -u "$(id -u):$(id -g)" "${container_name}" gpsbabelfe "$@" diff --git a/tools/archive_images/setup_user.sh b/tools/archive_images/setup_user.sh new file mode 100755 index 000000000..91e8d6dd4 --- /dev/null +++ b/tools/archive_images/setup_user.sh @@ -0,0 +1,7 @@ +#!/bin/bash +if ! getent group "$2" >/dev/null 2>&1; then + groupadd -g "$2" gpsbabel_user +fi +if ! getent passwd "$1" >/dev/null 2>&1; then + useradd -g "$2" -u "$1" -m gpsbabel_user +fi diff --git a/tools/archive_images/test.sh b/tools/archive_images/test.sh new file mode 100755 index 000000000..39b72917e --- /dev/null +++ b/tools/archive_images/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash -x +SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd)" + +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.5.0 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.5.1 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.5.2 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.5.3 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.5.4 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.6.0 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.7.0 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.8.0 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v 1.9.0 -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -- -D1 +"${SOURCE_DIR}/run_gpsbabel.sh" -v dev -- -D1 diff --git a/tools/build_and_test_cmake.sh b/tools/build_and_test_cmake.sh index 1cee99021..acc0118ed 100755 --- a/tools/build_and_test_cmake.sh +++ b/tools/build_and_test_cmake.sh @@ -15,7 +15,11 @@ git --no-pager log -n 1 # build and test keeping output within the pwd. export GBTEMP=$(pwd)/gbtemp mkdir -p "$GBTEMP" -cmake . -G Ninja -DCMAKE_BUILD_TYPE=Release +if [ -n "$1" ]; then + cmake . -G Ninja -DCMAKE_BUILD_TYPE=Release -DGPSABEL_DOCVERSION="$1" +else + cmake . -G Ninja -DCMAKE_BUILD_TYPE=Release +fi # As of 2018-10, all the virtualized travis build images are two cores per: # https://docs.travis-ci.com/user/reference/overview/ # We'll be slightly abusive on CPU knowing that I/O is virtualized. diff --git a/tools/travis_install_osx b/tools/ci_install_osx.sh similarity index 73% rename from tools/travis_install_osx rename to tools/ci_install_osx.sh index 643e4c929..c3a438406 100755 --- a/tools/travis_install_osx +++ b/tools/ci_install_osx.sh @@ -9,8 +9,6 @@ function version_ge() { test "$(printf "%s\n%s" "$1" "$2" | sort -rV | head -n 1 function debug() { cat "${CACHEDIR}/qt-${QT_VERSION}.env" find "${CACHEDIR}" -maxdepth 3 -ls - cat "${CACHEDIR}/Qt/InstallationLog.txt" - cat "${CACHEDIR}/Qt/components.xml" echo "$1" >&2 exit 1 } @@ -47,16 +45,6 @@ fi if [ -d "${QTDIR}/bin" ]; then echo "Using cached Qt." - echo "If you need to clear the cache see" - echo "https://docs.travis-ci.com/user/caching/#Fetching-and-storing-caches." - if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then - # the cache is being used. modify it to reset expiration date. - date > "${CACHEDIR}/timestamp" - fi - if [ -f "${CACHEDIR}/timestamp" ]; then - echo -n "Cache timestamp: " - cat "${CACHEDIR}/timestamp" - fi else rm -fr "${CACHEDIR}" mkdir -p "${CACHEDIR}" @@ -85,13 +73,11 @@ else ) elif [ "$METHOD" = "aqt" ]; then pip3 install aqtinstall>=2.0.0 - "${TRAVIS_BUILD_DIR}/tools/ci_install_qt.sh" mac "${QT_VERSION}" clang_64 "${CACHEDIR}/Qt" + "${CI_BUILD_DIR}/tools/ci_install_qt.sh" mac "${QT_VERSION}" clang_64 "${CACHEDIR}/Qt" echo "export PATH=${QTDIR}/bin:\$PATH" > "${CACHEDIR}/qt-${QT_VERSION}.env" else - # install-qt creates the install at $PWD/Qt. - QT_VERSION_SHORT=${QT_VERSION//./} - QT_CI_PACKAGES=qt.qt5.${QT_VERSION_SHORT}.clang_64,qt.qt5.${QT_VERSION_SHORT}.qtwebengine QT_CI_DOWNLOADER="wget -nv -c" PATH=${TRAVIS_BUILD_DIR}/tools/qtci:${PATH} install-qt "${QT_VERSION}" - rm "${CACHEDIR}"/qt-opensource*.dmg + echo "ERROR: unknown installation method ${METHOD}." >&2 + exit 1 fi popd validate diff --git a/tools/ci_install_windows.sh b/tools/ci_install_windows.sh index a14c99185..1f2cad96c 100755 --- a/tools/ci_install_windows.sh +++ b/tools/ci_install_windows.sh @@ -18,8 +18,8 @@ function validate() { ) } -QT_VERSION=${1:-5.12.10} -COMPILER=${2:-msvc2017_64} +QT_VERSION=${1:-6.5.3} +COMPILER=${2:-msvc2019_64} METHOD=${3:-default} if [ "${COMPILER}" = "msvc2017_64" ]; then @@ -28,6 +28,8 @@ elif [ "${COMPILER}" = "msvc2017" ]; then PACKAGE_SUFFIX=win32_msvc2017 elif [ "${COMPILER}" = "msvc2019_64" ]; then PACKAGE_SUFFIX=win64_msvc2019_64 +elif [ "${COMPILER}" = "msvc2019" ]; then + PACKAGE_SUFFIX=win32_msvc2019 else echo "ERROR: unrecognized Qt compiler ${COMPILER}." >&2 exit 1 @@ -47,20 +49,8 @@ else "${CI_BUILD_DIR}/tools/ci_install_qt.sh" windows "${QT_VERSION}" "${PACKAGE_SUFFIX}" "${CACHEDIR}/Qt" echo "export PATH=${QTDIR}/bin:\$PATH" > "${CACHEDIR}/qt.env" else - QT_VERSION_SHORT=${QT_VERSION//./} - QT_VERSION_MAJMIN=${QT_VERSION%.*} - curl -s -L -o "qt-opensource-windows-x86-${QT_VERSION}.exe" "https://download.qt.io/official_releases/qt/${QT_VERSION_MAJMIN}/${QT_VERSION}/qt-opensource-windows-x86-${QT_VERSION}.exe" - ls -l ./*.exe - netsh advfirewall firewall add rule name=dummyupqt dir=out action=block program="$(cygpath -w "${PWD}/qt-opensource-windows-x86-${QT_VERSION}.exe")" - "${PWD}/qt-opensource-windows-x86-${QT_VERSION}.exe" --verbose --script "${CI_BUILD_DIR}/tools/qtci/qt-install.qs" QTCI_OUTPUT="${CACHEDIR}/Qt" QTCI_PACKAGES="qt.qt5.${QT_VERSION_SHORT}.${PACKAGE_SUFFIX},qt.qt5.${QT_VERSION_SHORT}.qtwebengine" - netsh advfirewall firewall delete rule name=dummyupqt - rm "qt-opensource-windows-x86-${QT_VERSION}.exe" - ls "${CACHEDIR}/Qt" - rm -fr "${CACHEDIR}/Qt/Docs" - rm -fr "${CACHEDIR}/Qt/Examples" - rm -fr "${CACHEDIR}/Qt/Tools" - rm -f "${CACHEDIR}/Qt/MaintenanceTool.*" - echo "export PATH=${QTDIR}/bin:\$PATH" > "${CACHEDIR}/qt.env" + echo "ERROR: unknown installation method ${METHOD}." >&2 + exit 1 fi fi validate diff --git a/tools/ci_run_tidy.sh b/tools/ci_run_tidy.sh index 813043835..856fc3cfd 100755 --- a/tools/ci_run_tidy.sh +++ b/tools/ci_run_tidy.sh @@ -5,18 +5,19 @@ COMMIT=$(git log -1 --format='%H') CODACY_CLANG_TIDY=$(curl -s https://api.github.com/repos/codacy/codacy-clang-tidy/releases/latest | jq '.assets[] | select(.name|startswith("codacy-clang-tidy-linux-")) | .browser_download_url' | tr -d \") CHECKS="clang-diagnostic-*,clang-analyzer-*,cppcoreguidelines-*,modernize-*,bugprone-*,google-*,misc-*,performance-*,readability-*,-cppcoreguidelines-pro-type-vararg,-modernize-use-trailing-return-type,-readability-identifier-length" -HEADERFILTER=".*" +HEADERFILTER="$(pwd)/[^/]*\.h|$(pwd)/jeeps/[^/]*\.h|$(pwd)/src/core/[^/]*\.h|$(pwd)/gui/[^/]*\.h|gbversion\.h" -mkdir bld -cd bld +rm -fr bld-tidy +mkdir bld-tidy +cd bld-tidy cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DGPSBABEL_ENABLE_PCH=OFF -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. # generate included ui files cmake --build . cd .. # exclude third party library source -jq '[.[]|select(.file|contains("zlib")|not)] | [.[]|select(.file|contains("shapelib")|not)] | [.[]|select(.file|contains("bld")|not)]' \ -bld/compile_commands.json \ +jq '[.[]|select(.file|contains("zlib")|not)] | [.[]|select(.file|contains("shapelib")|not)] | [.[]|select(.file|contains("strptime")|not)] | [.[]|select(.file|contains("bld-tidy")|not)]' \ +bld-tidy/compile_commands.json \ > compile_commands.json # run-clang-tidy may still be forcing injection of escape sequences for colors. @@ -26,6 +27,8 @@ chmod +x run-clang-tidy-nocolor ./run-clang-tidy-nocolor -p "$(pwd)" -header-filter "${HEADERFILTER}" -checks "${CHECKS}" | \ tee tidy.out +grep warning: tidy.out | sed 's/.*\[/[/' | sort | uniq -c | sort | tee tidy.summary + curl -L "${CODACY_CLANG_TIDY}" --output codacy-clang-tidy chmod +x codacy-clang-tidy diff --git a/tools/ci_script_osx.sh b/tools/ci_script_osx.sh index 3cb759eec..7222bc86d 100755 --- a/tools/ci_script_osx.sh +++ b/tools/ci_script_osx.sh @@ -41,13 +41,13 @@ case "${GENERATOR[1]}" in Xcode | "Ninja Multi-Config") cmake "${SOURCE_DIR}" -DCMAKE_OSX_ARCHITECTURES=${ARCHS} -DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOY_TARGET} "${GENERATOR[@]}" cmake --build . --config Release - ctest -C Release + ctest -C Release --output-on-failure cmake --build . --config Release --target package_app ;; *) cmake "${SOURCE_DIR}" -DCMAKE_OSX_ARCHITECTURES=${ARCHS} -DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOY_TARGET} -DCMAKE_BUILD_TYPE=Release "${GENERATOR[@]}" cmake --build . - ctest + ctest --output-on-failure cmake --build . --target package_app cmake --build . --target gpsbabel.html cmake --build . --target gpsbabel.pdf diff --git a/tools/ci_setup_windows.ps1 b/tools/ci_setup_windows.ps1 index 582a84c08..4c38b28e9 100755 --- a/tools/ci_setup_windows.ps1 +++ b/tools/ci_setup_windows.ps1 @@ -7,7 +7,7 @@ # and https://github.com/microsoft/vswhere/wiki/Start-Developer-Command-Prompt Param( - [string] $qtdir = "C:\Qt\Qt5.12.10\5.12.10\msvc2017_64", + [string] $qtdir = "C:\Qt\6.5.3\msvc2019_64", [ValidateSet("x86", "amd64")][string] $arch = "amd64", [ValidateSet("x86", "amd64")][string] $host_arch = "amd64", [string] $vcversion diff --git a/tools/fixdoc b/tools/fixdoc index 4b10980de..e53749c3c 100755 --- a/tools/fixdoc +++ b/tools/fixdoc @@ -12,9 +12,10 @@ DIR=$1 TITLE=$2 SED="sed" -# MacOS using Homebrew -[ -f /usr/local/bin/gsed ] && SED=/usr/local/bin/gsed -[ -f /opt/local/bin/gsed ] && SED=/opt/local/bin/gsed +# macOS using Homebrew may be /usr/local (macOS intel) or /opt/homebrew (apple silicion) ... +if command -v gsed >/dev/null 2>&1; then + SED=$(command -v gsed) +fi [ ! -d "$DIR/tpl" ] && mkdir -p "$DIR/tpl" diff --git a/tools/make_docker_qtio_image b/tools/make_docker_qtio_image deleted file mode 100755 index f8786e3a3..000000000 --- a/tools/make_docker_qtio_image +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -ex -# you must be logged into docker for the push to succeed. - -#versuffix=${1:+_$1} # tag name must be lower case -versuffix=_qtio -tag=$(date -u +%Y%m%dT%H%M%SZ) - -QT_VERSION=5.12.10 -QT_VERSION_SHORT=${QT_VERSION//./} -QT_CI_PACKAGES="qt.qt5.${QT_VERSION_SHORT}.gcc_64,qt.qt5.${QT_VERSION_SHORT}.qtwebengine" -DOWNLOAD_URL=$(./qtci/find_qt_installer ${QT_VERSION}) -INSTALLER=$(basename $DOWNLOAD_URL) -TMPDIR=$(mktemp -d) - -cp Dockerfile${versuffix} $TMPDIR -cp ./qtci/extract-qt-installer ./qtci/qt-install.qs $TMPDIR -wget -nv -c -N -P $TMPDIR ${DOWNLOAD_URL} - -docker build --pull --file Dockerfile${versuffix} \ - --target qt_install_prep \ - $TMPDIR -docker build --pull --file Dockerfile${versuffix} \ - --network none \ - --build-arg INSTALLER=${INSTALLER} \ - --build-arg QT_CI_PACKAGES=${QT_CI_PACKAGES} \ - --build-arg QT_VERSION=${QT_VERSION} \ - --target qt_install \ - $TMPDIR -docker build --pull --file Dockerfile${versuffix} \ - --build-arg INSTALLER=${INSTALLER} \ - --build-arg QT_CI_PACKAGES=${QT_CI_PACKAGES} \ - --build-arg QT_VERSION=${QT_VERSION} \ - --tag tsteven4/gpsbabel_build_environment${versuffix}:latest \ - --tag tsteven4/gpsbabel_build_environment${versuffix}:$tag \ - $TMPDIR -/bin/rm -fr $TMPDIR -docker push tsteven4/gpsbabel_build_environment${versuffix}:$tag -docker push tsteven4/gpsbabel_build_environment${versuffix}:latest -docker image ls diff --git a/tools/qtci/LICENSE b/tools/qtci/LICENSE deleted file mode 100644 index 8dada3eda..000000000 --- a/tools/qtci/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/tools/qtci/README.gpsbabel b/tools/qtci/README.gpsbabel deleted file mode 100644 index 614c5bd8d..000000000 --- a/tools/qtci/README.gpsbabel +++ /dev/null @@ -1 +0,0 @@ -The files extract-qt-installer, install-qt, qt-install.qs, LICENSE, and README.md are from https://github.com/benlau/qtci diff --git a/tools/qtci/README.md b/tools/qtci/README.md deleted file mode 100644 index d1a7df644..000000000 --- a/tools/qtci/README.md +++ /dev/null @@ -1,164 +0,0 @@ -# QT-CI -This project collects a set of script for building Qt application for Android/iOS in command line environment. - -[![Build Status](https://travis-ci.org/benlau/qtci.svg?branch=master)](https://travis-ci.org/benlau/qtci) - -Check [.travis.yml](https://github.com/benlau/qtci/blob/master/.travis.yml) to see how it works. -It will demonstrate how to build an apk file using QT-CI scripts. - -Installation -============ - -Since this project is a collection of scripts, and the script in the bin folder does not have any dependence on each other. -It is not necessary to clone/download the whole repository into your build environment. -You may simply copy the script you need from this repository. - -**recipes/install-qt** - -To automatically install Qt, you can just download 2 scripts and grant them permission for execution. - -"recipes/install-qt" -"bin/extract-qt-installer" - -Then just run script "recipes/install-qt" with the desired version of Qt -Example: - - bash install-qt 5.9.4 - -Enviroument variables -===================== - -QT_CI_PACKAGES - packages to install. You can check available packages if set VERBOSE to 1. - -Example: - - export VERBOSE=1 - export QT_CI_PACKAGES=qt,qt.594,qt.594.gcc_64,qt.594.doc.qtvirtualkeyboard - -Setup -===== - - git clone https://github.com/benlau/qtci.git - - source qtci/path.env #Add qtci/bin and qtci/recipes to $PATH - - -Script -====== - -**(1) bin/extract-qt-installer** --------------------------------- - -Usage - -``` - extract-qt-installer [--disable-progress-report] qt-installer output_path - extract-qt-installer --list-packages qt-installer -``` - -Extract Qt from the installer to the target path (for Qt 5.5 or above). If --list-packages is given, it will show the available packages from the installer and terminate immediately. - -Example: - - extract-qt-installer qt-opensource-linux-x64-android-5.5.1.run ~/Qt - -**Remarks: The installation path must be absolute path** - -Environment Variables - - VERBOSE [Optional] Set to "true" will enable VERBOSE output - QT_CI_PACKAGES [Optional] Select the components to be installed instead of using default (eg. QT_CI_PACKAGES="qt.59.gcc_64") - QT_CI_LOGIN [Optional] The login name - QT_CI_PASSWORD [Optional] The password of login - -The arguments and environment required could be different due to the installer changes. Check the recipes folder or the wiki of known issues to find out the correct setting. - -**(2) bin/extract-ifw** --------------------------------- - -Extract installer of "Qt installer framework" to the target path - -Example: - - extract-ifw qt-installer-framework-opensource-1.5.0-x64.run ~/QtIfw - -**(3) bin/install-android-sdk** --------------------------------- - -Download and install Android SDK - -Example: - - install-android-sdk platform-tool,build-tools-20.0.0,android-19 - -**(4) bin/build-android-gradle-project** --------------------------------- - -Build a Qt Android project and sign the APK - -Usage: - - build-android-gradle-project project.pro - -Required Environment Variables - - QT_HOME [Required] The home directory of installed Qt. (e.g., ~/Qt/5.7) - KEYSTORE [Optional] The location of keystore. If it is set, it will be used to sign the created apk - KEYALIAS [Optional] The alias of the keystore - KEYPASS [Optional] The password of keystore. - ANDROID_TARGET_SDK_VERSION [Optional] Target Android SDK version. The default value is "19" - -(5) bin/increase-android-version-code --------------------------------- - -Usage - - increase-android-version-code AndroidManifest.xml - -Given an AndroidManifest.xml file, it will increase the value of the versionCode field by one. - -(6) bin/run-unittests ----------------------- - -Usage - - run-unittests project.pro - -Build and run a unit test project in the current folder. If qpm.json were found, it would call `qpm install` first. - -Recipes -======= - - -In the folder "recipes", it contains a set of script that could download and install specific Qt toolchains for a different environment. (Include Android) - -Please feel free to modify and submit a new recipe. - -Example - - apt-get install openjdk-8-jdk p7zip - - source path.env #Add $PWD/bin and $PWD/recipes to $PATH - - #Change to the installation path - - qt-5.5.1-android-19 # Install Qt 5.5.1 and Android SDK - - source qt-5.5.1-android-19.env # Add installed Qt path to $PATH - - -Reference -========= - - 1. [Continuous distribution for Qt applications on desktop and mobile](http://www.slidedeck.io/lasconic/qtci-qtcon2016) - 1. [Andrew's Articles - Continuous deployment for Qt applications](http://andrewdolby.com/articles/2016/continuous-deployment-for-qt-applications/) - -Related Projects -================= - - 1. [benlau/quickpromise](https://github.com/benlau/quickpromise) - Promise library for QML - 2. [benlau/quickcross](https://github.com/benlau/quickcross) - QML Cross Platform Utility Library - 3. [benlau/qsyncable](https://github.com/benlau/qsyncable) - Synchronize data between models - 4. [benlau/testable](https://github.com/benlau/testable) - QML Unit Test Utilities - 5. [benlau/quickflux](https://github.com/benlau/quickflux) - Message Dispatcher / Queue for Qt/QML - 6. [benlau/biginteger](https://github.com/benlau/biginteger) - QML BigInteger library diff --git a/tools/qtci/extract-qt-installer b/tools/qtci/extract-qt-installer deleted file mode 100755 index 073302bdc..000000000 --- a/tools/qtci/extract-qt-installer +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/bash -# QT-CI Project -# License: Apache-2.0 -# https://github.com/benlau/qtci - -function usage() { - echo "Usage:" - echo "extract-qt-installer qt-installer output_path" - echo "extract-qt-installer --list-packages qt-installer" - exit -1 -} - -LIST_PACKAGES=0 - -getopt --test > /dev/null 2>&1 -GETOPT_RET_CODE=$? - -set -e #quit on error - -if [ "$GETOPT_RET_CODE" != "4" ] -then - echo "Warning: gnu-getopt is not installed. Long parameter like '--list-package' will not be working. Please install gnu-getopt by 'brew install gnu-getopt'" -else - - OPTS=`getopt -o l --long list-packages --long disable-progress-report -n "extract-qt-installer" -- "$@"` - - eval set -- "$OPTS" - - while true - do - case "$1" in - --list-packages) - LIST_PACKAGES=1 - shift;; - --disable-progress-report) - DISABLE_PROGRESS_REPORT=1 - shift;; - --) shift;break;; - *) shift;; - esac - done -fi - - -export PATH=$PATH:$PWD -export WORKDIR=$PWD -INSTALLER=$1 -OUTPUT=$2 -SCRIPT=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/qt-install.qs -PACKAGES=$QT_CI_PACKAGES - -if [ $LIST_PACKAGES -gt 0 ] -then - - if [ $# -lt 1 ] - then - usage - fi - - OUTPUT="/tmp/Qt" - -else - - if [ $# -lt 2 ] - then - usage - fi - - if [[ ! "${OUTPUT:0:1}" = "/" ]] - then - echo output path must be an absolute path - exit -1 - fi - -fi - - -chmod u+x $1 -if [ -n "$QT_CI_DEBUG" ] -then - $INSTALLER -v --script $SCRIPT QTCI_LIST_PACKAGES="$LIST_PACKAGES" QTCI_PACKAGES="$PACKAGES" QTCI_OUTPUT="$OUTPUT" | grep "\(QTCI\|operation\)" - exit 0 -fi - -unset DISPLAY - -# platform minimal doesn't work on macos 10.14, 10.15. It did work on 10.13. -# https://bugreports.qt.io/browse/QTIFW-1471 -PLATFORM="--platform minimal" -if [ "$(uname)" = "Darwin" ]; then - vn=$(sw_vers -productVersion | cut -d. -f2,2) - if [ $vn -ge 14 ]; then - unset PLATFORM - fi -fi - -if [ -n "$DISABLE_PROGRESS_REPORT" ] -then - $INSTALLER $PLATFORM --script $SCRIPT QTCI_LIST_PACKAGES="$LIST_PACKAGES" QTCI_PACKAGES="$PACKAGES" QTCI_OUTPUT="$OUTPUT" -else - if [ -n "$VERBOSE" ] - then - $INSTALLER --verbose $PLATFORM --script $SCRIPT QTCI_LIST_PACKAGES="$LIST_PACKAGES" QTCI_PACKAGES="$PACKAGES" QTCI_OUTPUT="$OUTPUT" - else - $INSTALLER --verbose $PLATFORM --script $SCRIPT QTCI_LIST_PACKAGES="$LIST_PACKAGES" QTCI_PACKAGES="$PACKAGES" QTCI_OUTPUT="$OUTPUT" | grep "\(QTCI\|operation\)" - fi -fi - - diff --git a/tools/qtci/find_qt_installer b/tools/qtci/find_qt_installer deleted file mode 100755 index d1b5486fd..000000000 --- a/tools/qtci/find_qt_installer +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -e -# Reference: -# https://github.com/musescore/MuseScore/blob/master/build/travis/job_macos/install.sh - -QT_VERSION=${1:-5.12.0} - -QT_MAJOR_VERSION=$(echo ${QT_VERSION} | cut -d "." -f 1) -QT_MINOR_VERSION=$(echo ${QT_VERSION} | cut -d "." -f 2) -if [ "$(uname)" = "Darwin" ]; then - if { [ "${QT_MAJOR_VERSION}" -eq 5 ] && [ "${QT_MINOR_VERSION}" -ge 9 ]; } || [ "${QT_MAJOR_VERSION}" -ge 6 ]; then - # this was good from 5.9.0 through at least 5.12.0 - DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${QT_VERSION}/qt-opensource-mac-x64-${QT_VERSION}.dmg - else - # this was good from 5.2.1 through 5.8.0 - DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${QT_VERSION}/qt-opensource-mac-x64-clang-${QT_VERSION}.dmg - fi -elif [ "$(uname)" = "Linux" ]; then - # this was good from 5.2.1 through at least 5.12.0 - DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${QT_VERSION}/qt-opensource-linux-x64-${QT_VERSION}.run -else - echo "Unsupported system." >&2 - exit 1 -fi -echo $DOWNLOAD_URL diff --git a/tools/qtci/install-qt b/tools/qtci/install-qt deleted file mode 100755 index 1b1f4f328..000000000 --- a/tools/qtci/install-qt +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -e -# Reference: -# https://github.com/musescore/MuseScore/blob/master/build/travis/job_macos/install.sh - -QT_VERSION=${1:-5.12.0} -QT_TARGET_CATALOG=${2:-$PWD} -QT_CI_DOWNLOADER=${QT_CI_DOWNLOADER:-"wget -c -N"} - -QT_MAJOR_VERSION=$(echo ${QT_VERSION} | cut -d "." -f 1) -QT_MINOR_VERSION=$(echo ${QT_VERSION} | cut -d "." -f 2) -if [ "$(uname)" = "Darwin" ]; then - if { [ "${QT_MAJOR_VERSION}" -eq 5 ] && [ "${QT_MINOR_VERSION}" -ge 9 ]; } || [ "${QT_MAJOR_VERSION}" -ge 6 ]; then - # this was good from 5.9.0 through at least 5.12.0 - DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${QT_VERSION}/qt-opensource-mac-x64-${QT_VERSION}.dmg - else - # this was good from 5.2.1 through 5.8.0 - DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${QT_VERSION}/qt-opensource-mac-x64-clang-${QT_VERSION}.dmg - fi - COMPILER=clang_64 -elif [ "$(uname)" = "Linux" ]; then - # this was good from 5.2.1 through at least 5.12.0 - DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${QT_VERSION}/qt-opensource-linux-x64-${QT_VERSION}.run - COMPILER=gcc_64 -else - echo "Unsupported system." >&2 - exit 1 -fi -INSTALLER=$(basename $DOWNLOAD_URL) -ENVFILE=${QT_TARGET_CATALOG}/qt-${QT_VERSION}.env - -echo Downloading Qt -${QT_CI_DOWNLOADER} ${DOWNLOAD_URL} || exit 1 - -echo Installing Qt -if [ "$(uname)" = "Darwin" ]; then - INSTALLER_NAME=${INSTALLER%.*} - APPFILE=/Volumes/${INSTALLER_NAME}/${INSTALLER_NAME}.app/Contents/MacOS/${INSTALLER_NAME} - hdiutil attach ${PWD}/${INSTALLER} - sandbox-exec -n no-network extract-qt-installer $APPFILE ${QT_TARGET_CATALOG}/Qt - # workaround apparent exit of extract-qt-installer before finished, - # which results in hdiutil "hdiutil: couldn't unmount "disk1" - Resource busy" - # and the install resources not being available. - #hdiutil detach /Volumes/${INSTALLER_NAME} - count=0 - until hdiutil detach /Volumes/${INSTALLER_NAME} || [ $count -ge 12 ] - do - echo "Wait and attempt to detach again" - count=`expr $count + 1` - sleep 5 - done -elif [ "$(uname)" = "Linux" ]; then - unshare -r -n extract-qt-installer ${PWD}/${INSTALLER} ${QT_TARGET_CATALOG}/Qt -fi - -echo Create ${ENVFILE} -if [ -d "${QT_TARGET_CATALOG}/Qt/${QT_VERSION}/${COMPILER}/bin" ]; then - echo "export PATH=${QT_TARGET_CATALOG}/Qt/${QT_VERSION}/${COMPILER}/bin:$PATH" > ${ENVFILE} -elif [ -d "${QT_TARGET_CATALOG}/Qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${COMPILER}/bin" ]; then - # some packages use an abbreviated version x.y in the path instead of x.y.z - echo "export PATH=${QT_TARGET_CATALOG}/Qt/${QT_MAJOR_VERSION}.${QT_MINOR_VERSION}/${COMPILER}/bin:$PATH" > ${ENVFILE} -fi - diff --git a/tools/qtci/install-qt-online b/tools/qtci/install-qt-online deleted file mode 100755 index 63d686d73..000000000 --- a/tools/qtci/install-qt-online +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -e -# Install Qt by online installer - -function usage() { - echo "Usage:" - echo "install-qt-online \"packages\" [output_path [qt_installer_version]]" - echo "Examples:" - echo "install-qt-online \"qt.qt5.5121.gcc_64\"" - echo "install-qt-online \"qt.qt5.5121.gcc_64\" /opt/Qt" - echo "install-qt-online \"qt.qt5.5121.gcc_64\" /opt/Qt latest" - echo "install-qt-online \"qt.qt5.5121.gcc_64\" /opt/Qt 3.1.1" - exit -1 -} - -if [ $# -lt 1 ] -then - usage -fi - -export QT_CI_PACKAGES=${1} -QT_TARGET_CATALOG=${2:-$PWD} -INSTALLER_VERSION=${3:-latest} # lastest or a version triplet, e.g. 3.1.1 -QT_CI_DOWNLOADER=${QT_CI_DOWNLOADER:-"wget -c -N"} - -if [ "$(uname)" = "Darwin" ]; then - if [ "${INSTALLER_VERSION}" = "latest" ]; then - DOWNLOAD_URL=https://download.qt.io/official_releases/online_installers/qt-unified-mac-x64-online.dmg - else - DOWNLOAD_URL=https://download.qt.io/archive/online_installers/$(echo ${INSTALLER_VERSION} | cut -d . -f1-2)/qt-unified-mac-x64-${INSTALLER_VERSION}-online.dmg - fi - COMPILER=clang_64 -elif [ "$(uname)" = "Linux" ]; then - if [ "${INSTALLER_VERSION}" = "latest" ]; then - DOWNLOAD_URL=https://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run - else - DOWNLOAD_URL=https://download.qt.io/archive/online_installers/$(echo ${INSTALLER_VERSION} | cut -d . -f1-2)/qt-unified-linux-x64-${INSTALLER_VERSION}-online.run - fi - COMPILER=gcc_64 -else - echo "Unsupported system." >&2 - exit 1 -fi - -INSTALLER=$(basename $DOWNLOAD_URL) - -echo Downloading Qt -${QT_CI_DOWNLOADER} ${DOWNLOAD_URL} || exit 1 - -echo Installing Qt - -if [ "$(uname)" = "Darwin" ]; then - hdiutil attach ${PWD}/${INSTALLER} -plist > minfo.plist - MOUNTPOINT=$(/usr/libexec/PlistBuddy -c "Print :system-entities:0:mount-point" minfo.plist || \ - /usr/libexec/PlistBuddy -c "Print :system-entities:1:mount-point" minfo.plist || \ - /usr/libexec/PlistBuddy -c "Print :system-entities:2:mount-point" minfo.plist) - INSTALLER_NAME=$(basename "${MOUNTPOINT}") - APPFILE="${MOUNTPOINT}"/${INSTALLER_NAME}.app/Contents/MacOS/${INSTALLER_NAME} - extract-qt-installer "$APPFILE" "${QT_TARGET_CATALOG}/Qt" - hdiutil detach "${MOUNTPOINT}" -elif [ "$(uname)" = "Linux" ]; then - extract-qt-installer ${PWD}/${INSTALLER} "${QT_TARGET_CATALOG}/Qt" -fi diff --git a/tools/qtci/qt-install.qs b/tools/qtci/qt-install.qs deleted file mode 100644 index d711157d1..000000000 --- a/tools/qtci/qt-install.qs +++ /dev/null @@ -1,256 +0,0 @@ -// QT-CI Project -// License: Apache-2.0 -// https://github.com/benlau/qtci - -function log() { - var msg = ["QTCI: "].concat([].slice.call(arguments)); - console.log(msg.join(" ")); -} - -function printObject(object) { - var lines = []; - for (var i in object) { - lines.push([i, object[i]].join(" ")); - } - log(lines.join(",")); -} - -var status = { - widget: null, - finishedPageVisible: false, - installationFinished: false -} - -function tryFinish() { - if (status.finishedPageVisible && status.installationFinished) { - if (status.widget.LaunchQtCreatorCheckBoxForm) { - // Disable this checkbox for minimal platform - status.widget.LaunchQtCreatorCheckBoxForm.launchQtCreatorCheckBox.setChecked(false); - } - if (status.widget.RunItCheckBox) { - // LaunchQtCreatorCheckBoxForm may not work for newer versions. - status.widget.RunItCheckBox.setChecked(false); - } - log("Press Finish Button"); - gui.clickButton(buttons.FinishButton); - } -} - -function Controller() { - installer.installationFinished.connect(function() { - status.installationFinished = true; - gui.clickButton(buttons.NextButton); - tryFinish(); - }); - installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes); - installer.setMessageBoxAutomaticAnswer("installationErrorWithRetry", QMessageBox.Ignore); - installer.setMessageBoxAutomaticAnswer("XcodeError", QMessageBox.Ok); - - // Allow to cancel installation for arguments --list-packages - installer.setMessageBoxAutomaticAnswer("cancelInstallation", QMessageBox.Yes); -} - -Controller.prototype.WelcomePageCallback = function() { - log("Welcome Page"); - - gui.clickButton(buttons.NextButton); - - var widget = gui.currentPageWidget(); - - /* - Online installer 3.0.6 - - It must disconnect the completeChanged callback after used, otherwise it will click the 'next' button on another pages - */ - var callback = function() { - gui.clickButton(buttons.NextButton); - widget.completeChanged.disconnect(callback); - } - - widget.completeChanged.connect(callback); -} - -Controller.prototype.CredentialsPageCallback = function() { - - var login = installer.environmentVariable("QT_CI_LOGIN"); - var password = installer.environmentVariable("QT_CI_PASSWORD"); - - if (login === "" || password === "") { - gui.clickButton(buttons.CommitButton); - } - - var widget = gui.currentPageWidget(); - - widget.loginWidget.EmailLineEdit.setText(login); - - widget.loginWidget.PasswordLineEdit.setText(password); - - gui.clickButton(buttons.CommitButton); -} - -Controller.prototype.ComponentSelectionPageCallback = function() { - log("ComponentSelectionPageCallback"); - - function list_packages() { - var components = installer.components(); - log("Available components: " + components.length); - var packages = ["Packages: "]; - - for (var i = 0; i < components.length; i++) { - packages.push(components[i].name); - } - log(packages.join(" ")); - } - - var widget = gui.currentPageWidget(); - - var archiveCheckBox = gui.findChild(widget, "Archive"); - var latestCheckBox = gui.findChild(widget, "Latest releases"); - var fetchButton = gui.findChild(widget, "FetchCategoryButton"); - - if (archiveCheckBox != null) { - // check archive - archiveCheckBox.click(); - } - if (latestCheckBox != null) { - // uncheck latest - latestCheckBox.click(); - } - if (fetchButton != null) { - fetchButton.click() - } - - if (installer.value("QTCI_LIST_PACKAGES", "0") != "0") { - list_packages(); - gui.clickButton(buttons.CancelButton); - return; - } - - log("Select components"); - - function trim(str) { - return str.replace(/^ +/, "").replace(/ *$/, ""); - } - - var packages = trim(installer.value("QTCI_PACKAGES")).split(","); - if (packages.length > 0 && packages[0] !== "") { - widget.deselectAll(); - var components = installer.components(); - var allfound = true; - for (var i in packages) { - var pkg = trim(packages[i]); - var found = false; - for (var j in components) { - if (components[j].name === pkg) { - found = true; - break; - } - } - if (!found) { - allfound = false; - log("ERROR: Package " + pkg + " not found."); - } else { - log("Select " + pkg); - widget.selectComponent(pkg); - } - } - if (!allfound) { - list_packages(); - // TODO: figure out how to set non-zero exit status. - gui.clickButton(buttons.CancelButton); - return; - } - } else { - log("Use default component list"); - } - - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.IntroductionPageCallback = function() { - log("Introduction Page"); - log("Retrieving meta information from remote repository"); - - /* - Online installer 3.0.6 - - Don't click buttons.NextButton directly. It will skip the componenet selection. - */ - - if (installer.isOfflineOnly()) { - gui.clickButton(buttons.NextButton); - } -} - -Controller.prototype.TargetDirectoryPageCallback = function() { - var output = installer.value("QTCI_OUTPUT"); - log("Set target installation page: " + output); - var widget = gui.currentPageWidget(); - - if (widget != null) { - widget.TargetDirectoryLineEdit.setText(output); - } - - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.LicenseAgreementPageCallback = function() { - log("Accept license agreement"); - var widget = gui.currentPageWidget(); - - if (widget != null) { - widget.AcceptLicenseRadioButton.setChecked(true); - } - - gui.clickButton(buttons.NextButton); -} - -Controller.prototype.ReadyForInstallationPageCallback = function() { - log("Ready to install"); - - // Bug? If commit button pressed too quickly finished callback might not show the checkbox to disable running qt creator - // Behaviour started around 5.10. You don't actually have to press this button at all with those versions, even though gui.isButtonEnabled() returns true. - gui.clickButton(buttons.CommitButton, 200); -} - -Controller.prototype.PerformInstallationPageCallback = function() { - log("PerformInstallationPageCallback"); - gui.clickButton(buttons.CommitButton); -} - -Controller.prototype.FinishedPageCallback = function() { - log("FinishedPageCallback"); - - var widget = gui.currentPageWidget(); - - // Bug? Qt 5.9.5 and Qt 5.9.6 installer show finished page before the installation completed - // Don't press "finishButton" immediately - status.finishedPageVisible = true; - status.widget = widget; - tryFinish(); -} - -// Telemetry disabled -Controller.prototype.DynamicTelemetryPluginFormCallback = function() -{ - log("TelemetryPluginFormCallback"); - var page = gui.pageWidgetByObjectName("DynamicTelemetryPluginForm"); - page.statisticGroupBox.disableStatisticRadioButton.setChecked(true); - gui.clickButton(buttons.NextButton); -} - -// On windows installs there is a page about the start menu. -Controller.prototype.StartMenuDirectoryPageCallback = function() { - log("StartMenuDirectoryPageCallback"); - gui.clickButton(buttons.NextButton); -} - -// qt online installer 3.2.1: open source users must now accept the open -// source obligations. -// https://www.qt.io/blog/qt-online-installer-3.2.1-released -Controller.prototype.ObligationsPageCallback = function() -{ - log("ObligationsPageCallback"); - var page = gui.pageWidgetByObjectName("ObligationsPage"); - page.obligationsAgreement.setChecked(true); - page.completeChanged(); - gui.clickButton(buttons.NextButton); -} diff --git a/tools/schema/gpx/fetch b/tools/schema/gpx/fetch new file mode 100755 index 000000000..6c6703d7c --- /dev/null +++ b/tools/schema/gpx/fetch @@ -0,0 +1,14 @@ +#!/bin/bash + +wget -O topografix/gpx10.xsd "http://www.topografix.com/GPX/1/0/gpx.xsd" +wget -O topografix/gpx11.xsd "http://www.topografix.com/GPX/1/1/gpx.xsd" + +wget -P garmin "https://www8.garmin.com/xmlschemas/GpxExtensions/v3/GpxExtensionsv3.xsd" +wget -P garmin "https://www8.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" +wget -P garmin "https://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd" +wget -P garmin "https://www8.garmin.com/xmlschemas/TripExtensionsv1.xsd" + +wget -O groundspeak/cache10.xsd "http://www.groundspeak.com/cache/1/0/cache.xsd" +wget -O groundspeak/cache101.xsd "http://www.groundspeak.com/cache/1/0/1/cache.xsd" +wget -O groundspeak/cache11.xsd "http://www.groundspeak.com/cache/1/1/cache.xsd" +wget -O groundspeak/cache12.xsd "http://www.groundspeak.com/cache/1/2/cache.xsd" diff --git a/tools/schema/gpx/garmin/GpxExtensionsv3.xsd b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd new file mode 100644 index 000000000..04d396491 --- /dev/null +++ b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd @@ -0,0 +1,215 @@ + + + + + This schema defines the Garmin extensions to be used with the GPX 1.1 schema. + The root elements defined by this schema are intended to be used as child + elements of the "extensions" elements in the GPX 1.1 schema. The GPX 1.1 + schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + + + + + + + + + This type contains data fields available in Garmin GDB waypoints that cannot + be represented in waypoints in GPX 1.1 instances. + + + + + + + + + + + + + + + + This type contains a list of categories to which a waypoint has been assigned. + Note that this list may contain categories which do not exist for a particular + application installation. + + + + + + + + + + + + + + + + + + + + + + + Category provides the ability to specify the type of a + phone number. For example, a phone number can be categorized as + "Home", "Work", "Mobile" e.t.c + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB tracks that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + This type contains data fields available in Garmin GDB track points that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a string that specifies how a waypoint should be + displayed on a map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + The longitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/GpxExtensionsv3.xsd.1 b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd.1 new file mode 100644 index 000000000..04d396491 --- /dev/null +++ b/tools/schema/gpx/garmin/GpxExtensionsv3.xsd.1 @@ -0,0 +1,215 @@ + + + + + This schema defines the Garmin extensions to be used with the GPX 1.1 schema. + The root elements defined by this schema are intended to be used as child + elements of the "extensions" elements in the GPX 1.1 schema. The GPX 1.1 + schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + + + + + + + + + This type contains data fields available in Garmin GDB waypoints that cannot + be represented in waypoints in GPX 1.1 instances. + + + + + + + + + + + + + + + + This type contains a list of categories to which a waypoint has been assigned. + Note that this list may contain categories which do not exist for a particular + application installation. + + + + + + + + + + + + + + + + + + + + + + + Category provides the ability to specify the type of a + phone number. For example, a phone number can be categorized as + "Home", "Work", "Mobile" e.t.c + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB routes that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + + This type contains data fields available in Garmin GDB tracks that cannot + be represented in routes in GPX 1.1 instances. + + + + + + + + + + This type contains data fields available in Garmin GDB track points that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a string that specifies how a waypoint should be + displayed on a map. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + The longitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd new file mode 100644 index 000000000..78b8649a6 --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd @@ -0,0 +1,74 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd.1 b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd.1 new file mode 100644 index 000000000..78b8649a6 --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv1.xsd.1 @@ -0,0 +1,74 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd new file mode 100644 index 000000000..3417edd3a --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd @@ -0,0 +1,94 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type contains a speed measured in meters per second. + + + + + + + This type contains an angle measured in degrees in a clockwise direction from the true north line. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd.1 b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd.1 new file mode 100644 index 000000000..3417edd3a --- /dev/null +++ b/tools/schema/gpx/garmin/TrackPointExtensionv2.xsd.1 @@ -0,0 +1,94 @@ + + + + + This schema defines Garmin extensions to be used with the GPX 1.1 schema. + The root element defined by this schema is intended to be used as a child + element of the "extensions" elements in the trkpt element in the GPX 1.1 schema. + The GPX 1.1 schema is available at http://www.topografix.com/GPX/1/1/gpx.xsd. + This is a replacement for TrackPointExtension in + http://www.garmin.com/xmlschemas/GpxExtensions/v3 + + + + + + + This type contains data fields that cannot + be represented in track points in GPX 1.1 instances. + + + + + + + + + + + + + + + + + This type contains a temperature value measured in degrees Celsius. + + + + + + + This type contains a distance value measured in meters. + + + + + + + This type contains a heart rate measured in beats per minute. + + + + + + + + + This type contains a cadence measured in revolutions per minute. + + + + + + + + + This type contains a speed measured in meters per second. + + + + + + + This type contains an angle measured in degrees in a clockwise direction from the true north line. + + + + + + + + + + This type provides the ability to extend any data type that includes it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TripExtensionsv1.xsd b/tools/schema/gpx/garmin/TripExtensionsv1.xsd new file mode 100644 index 000000000..588d55de3 --- /dev/null +++ b/tools/schema/gpx/garmin/TripExtensionsv1.xsd @@ -0,0 +1,136 @@ + + + + + This schema defines the Garmin route extensions specific to trips to be used + with the GPX 1.1 schema. The root elements defined by this schema are intended to be used as + child elements of the rte element in the GPX 1.1 schema. The GPX 1.1 schema is available at + http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + This type contains data fields intended to be used as child elements of + the rte element in the GPX 1.1 schema + + + + + Suggested transportation mode for this route. If the processor does + not know about the suggested transportation mode, a default will be chosen. Examples + include; Automotive, Motorcycling, Walking, Hiking, Mountaineering, Bicyling, + TourCycling, MountainBiking, ATV, DirtBiking, Truck, RV + + + + + + + + + + + Route via points are announced stops during a route. This type contains + data fields intended to be used as child elements of the rtept element in the GPX 1.1 schema + + + + + + Planned time to leave this route via, not valid for the last via in a + route. Date and time are in Univeral Coordinated Time (UTC), not local time. Conforms to + ISO 8601 specification for date/time representation. + + + + + Time spent at this route via. + + + + + Planned time to arrive at this route via, not valid for the first via + in a route. Date and time are in Univeral Coordinated Time (UTC), not local time. + Conforms to ISO 8601 specification for date/time representation. + + + + + Suggested calculation mode between this route via and the next route + via. If the CalculationMode element is not present or if the processor does not + recognize the suggested calculation mode, the processor may use a calculation mode + specified on a previous via. If none have been previously specified, the processor may + chose a default. Examples include; FasterTime, ShorterDistance, Direct (Off Road), + LessFuel, ScenicRoads + + + + + Suggested elevation mode between this route via and the next route + via. If the ElevationMode element is not present or if the processor does not recognize + the suggested elevation mode, the processor may use an elevation mode specified on a + previous via. If none have been previously specified, the processor may chose a default. + Examples include; Standard, MinimizeAscent + + + + + + + + + + A specific road or trail that the user selected to follow + between this route via and the next route via. If the NamedRoad element is not present + or if the processor does not recognize the suggested named road, the processor may use a + named road specified on a previous via. If none have been previously specified, the + processor may ignore this. + + + + + User friendly name of the road or trail + + + + + ID of the road or trail + + + + + Product and family ID of map product that contains the road or trail + + + + + + + + + + + Route shaping points influence the route path that is calculated, but are + not announced or listed in driving directions. This type contains data fields intended to be + used as child elements of the rtept element in the GPX 1.1 schema + + + + + + + + + This type provides the ability to extend any data type that includes + it. + + + + + + + diff --git a/tools/schema/gpx/garmin/TripExtensionsv1.xsd.1 b/tools/schema/gpx/garmin/TripExtensionsv1.xsd.1 new file mode 100644 index 000000000..588d55de3 --- /dev/null +++ b/tools/schema/gpx/garmin/TripExtensionsv1.xsd.1 @@ -0,0 +1,136 @@ + + + + + This schema defines the Garmin route extensions specific to trips to be used + with the GPX 1.1 schema. The root elements defined by this schema are intended to be used as + child elements of the rte element in the GPX 1.1 schema. The GPX 1.1 schema is available at + http://www.topografix.com/GPX/1/1/gpx.xsd. + + + + + + + This type contains data fields intended to be used as child elements of + the rte element in the GPX 1.1 schema + + + + + Suggested transportation mode for this route. If the processor does + not know about the suggested transportation mode, a default will be chosen. Examples + include; Automotive, Motorcycling, Walking, Hiking, Mountaineering, Bicyling, + TourCycling, MountainBiking, ATV, DirtBiking, Truck, RV + + + + + + + + + + + Route via points are announced stops during a route. This type contains + data fields intended to be used as child elements of the rtept element in the GPX 1.1 schema + + + + + + Planned time to leave this route via, not valid for the last via in a + route. Date and time are in Univeral Coordinated Time (UTC), not local time. Conforms to + ISO 8601 specification for date/time representation. + + + + + Time spent at this route via. + + + + + Planned time to arrive at this route via, not valid for the first via + in a route. Date and time are in Univeral Coordinated Time (UTC), not local time. + Conforms to ISO 8601 specification for date/time representation. + + + + + Suggested calculation mode between this route via and the next route + via. If the CalculationMode element is not present or if the processor does not + recognize the suggested calculation mode, the processor may use a calculation mode + specified on a previous via. If none have been previously specified, the processor may + chose a default. Examples include; FasterTime, ShorterDistance, Direct (Off Road), + LessFuel, ScenicRoads + + + + + Suggested elevation mode between this route via and the next route + via. If the ElevationMode element is not present or if the processor does not recognize + the suggested elevation mode, the processor may use an elevation mode specified on a + previous via. If none have been previously specified, the processor may chose a default. + Examples include; Standard, MinimizeAscent + + + + + + + + + + A specific road or trail that the user selected to follow + between this route via and the next route via. If the NamedRoad element is not present + or if the processor does not recognize the suggested named road, the processor may use a + named road specified on a previous via. If none have been previously specified, the + processor may ignore this. + + + + + User friendly name of the road or trail + + + + + ID of the road or trail + + + + + Product and family ID of map product that contains the road or trail + + + + + + + + + + + Route shaping points influence the route path that is calculated, but are + not announced or listed in driving directions. This type contains data fields intended to be + used as child elements of the rtept element in the GPX 1.1 schema + + + + + + + + + This type provides the ability to extend any data type that includes + it. + + + + + + + diff --git a/tools/schema/gpx/groundspeak/cache10.xsd b/tools/schema/gpx/groundspeak/cache10.xsd new file mode 100644 index 000000000..425dfb9ad --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache10.xsd @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/groundspeak/cache101.xsd b/tools/schema/gpx/groundspeak/cache101.xsd new file mode 100644 index 000000000..d0873b4a6 --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache101.xsd @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/groundspeak/cache11.xsd b/tools/schema/gpx/groundspeak/cache11.xsd new file mode 100644 index 000000000..fd83a6d5d --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache11.xsd @@ -0,0 +1,152 @@ +īģŋ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/groundspeak/cache12.xsd b/tools/schema/gpx/groundspeak/cache12.xsd new file mode 100644 index 000000000..5324fabbd --- /dev/null +++ b/tools/schema/gpx/groundspeak/cache12.xsd @@ -0,0 +1,94 @@ +īģŋ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/master.xsd b/tools/schema/gpx/master.xsd new file mode 100644 index 000000000..7f159f325 --- /dev/null +++ b/tools/schema/gpx/master.xsd @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/tools/schema/gpx/testonlyschema.xsd b/tools/schema/gpx/testonlyschema.xsd new file mode 100644 index 000000000..7bf28b1c1 --- /dev/null +++ b/tools/schema/gpx/testonlyschema.xsd @@ -0,0 +1,15 @@ + + + + + + This schema exist only for regression testing of gpsbabel. + + + + + diff --git a/tools/schema/gpx/topografix/gpx10.xsd b/tools/schema/gpx/topografix/gpx10.xsd new file mode 100644 index 000000000..a49992ddd --- /dev/null +++ b/tools/schema/gpx/topografix/gpx10.xsd @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/schema/gpx/topografix/gpx11.xsd b/tools/schema/gpx/topografix/gpx11.xsd new file mode 100644 index 000000000..a113a41c3 --- /dev/null +++ b/tools/schema/gpx/topografix/gpx11.xsd @@ -0,0 +1,788 @@ + + + + + + GPX schema version 1.1 - For more information on GPX and this schema, visit http://www.topografix.com/gpx.asp + + GPX uses the following conventions: all coordinates are relative to the WGS84 datum. All measurements are in metric units. + + + + + + + GPX is the root element in the XML file. + + + + + + + + GPX documents contain a metadata header, followed by waypoints, routes, and tracks. You can add your own elements + to the extensions section of the GPX document. + + + + + + + Metadata about the file. + + + + + + + A list of waypoints. + + + + + + + A list of routes. + + + + + + + A list of tracks. + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + You must include the version number in your GPX document. + + + + + + + You must include the name or URL of the software that created your GPX document. This allows others to + inform the creator of a GPX instance document that fails to validate. + + + + + + + + + Information about the GPX file, author, and copyright restrictions goes in the metadata section. Providing rich, + meaningful information about your GPX files allows others to search for and use your GPS data. + + + + + + + The name of the GPX file. + + + + + + + A description of the contents of the GPX file. + + + + + + + The person or organization who created the GPX file. + + + + + + + Copyright and license information governing use of the file. + + + + + + + URLs associated with the location described in the file. + + + + + + + The creation date of the file. + + + + + + + Keywords associated with the file. Search engines or databases can use this information to classify the data. + + + + + + + Minimum and maximum coordinates which describe the extent of the coordinates in the file. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + + wpt represents a waypoint, point of interest, or named feature on a map. + + + + + + + + Elevation (in meters) of the point. + + + + + + + Creation/modification timestamp for element. Date and time in are in Univeral Coordinated Time (UTC), not local time! Conforms to ISO 8601 specification for date/time representation. Fractional seconds are allowed for millisecond timing in tracklogs. + + + + + + + Magnetic variation (in degrees) at the point + + + + + + + Height (in meters) of geoid (mean sea level) above WGS84 earth ellipsoid. As defined in NMEA GGA message. + + + + + + + + + The GPS name of the waypoint. This field will be transferred to and from the GPS. GPX does not place restrictions on the length of this field or the characters contained in it. It is up to the receiving application to validate the field before sending it to the GPS. + + + + + + + GPS waypoint comment. Sent to GPS as comment. + + + + + + + A text description of the element. Holds additional information about the element intended for the user, not the GPS. + + + + + + + Source of data. Included to give user some idea of reliability and accuracy of data. "Garmin eTrex", "USGS quad Boston North", e.g. + + + + + + + Link to additional information about the waypoint. + + + + + + + Text of GPS symbol name. For interchange with other programs, use the exact spelling of the symbol as displayed on the GPS. If the GPS abbreviates words, spell them out. + + + + + + + Type (classification) of the waypoint. + + + + + + + + + Type of GPX fix. + + + + + + + Number of satellites used to calculate the GPX fix. + + + + + + + Horizontal dilution of precision. + + + + + + + Vertical dilution of precision. + + + + + + + Position dilution of precision. + + + + + + + Number of seconds since last DGPS update. + + + + + + + ID of DGPS station used in differential correction. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + The latitude of the point. This is always in decimal degrees, and always in WGS84 datum. + + + + + + + The longitude of the point. This is always in decimal degrees, and always in WGS84 datum. + + + + + + + + + rte represents route - an ordered list of waypoints representing a series of turn points leading to a destination. + + + + + + + GPS name of route. + + + + + + + GPS comment for route. + + + + + + + Text description of route for user. Not sent to GPS. + + + + + + + Source of data. Included to give user some idea of reliability and accuracy of data. + + + + + + + Links to external information about the route. + + + + + + + GPS route number. + + + + + + + Type (classification) of route. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + A list of route points. + + + + + + + + + + trk represents a track - an ordered list of points describing a path. + + + + + + + GPS name of track. + + + + + + + GPS comment for track. + + + + + + + User description of track. + + + + + + + Source of data. Included to give user some idea of reliability and accuracy of data. + + + + + + + Links to external information about track. + + + + + + + GPS track number. + + + + + + + Type (classification) of track. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + A Track Segment holds a list of Track Points which are logically connected in order. To represent a single GPS track where GPS reception was lost, or the GPS receiver was turned off, start a new Track Segment for each continuous span of track data. + + + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + + A Track Segment holds a list of Track Points which are logically connected in order. To represent a single GPS track where GPS reception was lost, or the GPS receiver was turned off, start a new Track Segment for each continuous span of track data. + + + + + + + A Track Point holds the coordinates, elevation, timestamp, and metadata for a single point in a track. + + + + + + + + You can add extend GPX by adding your own elements from another schema here. + + + + + + + + + + Information about the copyright holder and any license governing use of this file. By linking to an appropriate license, + you may place your data into the public domain or grant additional usage rights. + + + + + + + Year of copyright. + + + + + + + Link to external file containing license text. + + + + + + + + Copyright holder (TopoSoft, Inc.) + + + + + + + + + A link to an external resource (Web page, digital photo, video clip, etc) with additional information. + + + + + + + Text of hyperlink. + + + + + + + Mime type of content (image/jpeg) + + + + + + + + URL of hyperlink. + + + + + + + + + An email address. Broken into two parts (id and domain) to help prevent email harvesting. + + + + + + id half of email address (billgates2004) + + + + + + + domain half of email address (hotmail.com) + + + + + + + + + A person or organization. + + + + + + + Name of person or organization. + + + + + + + Email address. + + + + + + + Link to Web site or other external information about person. + + + + + + + + + + A geographic point with optional elevation and time. Available for use by other schemas. + + + + + + + The elevation (in meters) of the point. + + + + + + + The time that the point was recorded. + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + An ordered sequence of points. (for polygons or polylines, e.g.) + + + + + + + Ordered list of geographic points. + + + + + + + + + + Two lat/lon pairs defining the extent of an element. + + + + + + The minimum latitude. + + + + + + + The minimum longitude. + + + + + + + The maximum latitude. + + + + + + + The maximum longitude. + + + + + + + + + + The latitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + + + The longitude of the point. Decimal degrees, WGS84 datum. + + + + + + + + + + + + Used for bearing, heading, course. Units are decimal degrees, true (not magnetic). + + + + + + + + + + + + Type of GPS fix. none means GPS had no fix. To signify "the fix info is unknown, leave out fixType entirely. pps = military signal used + + + + + + + + + + + + + + + Represents a differential GPS station. + + + + + + + + + diff --git a/tools/kml22-schema/atom-author-link.xsd b/tools/schema/kml/atom-author-link.xsd similarity index 100% rename from tools/kml22-schema/atom-author-link.xsd rename to tools/schema/kml/atom-author-link.xsd diff --git a/tools/kml22-schema/kml22gx.xsd b/tools/schema/kml/kml22gx.xsd similarity index 100% rename from tools/kml22-schema/kml22gx.xsd rename to tools/schema/kml/kml22gx.xsd diff --git a/tools/kml22-schema/ogckml22.xsd b/tools/schema/kml/ogckml22.xsd similarity index 100% rename from tools/kml22-schema/ogckml22.xsd rename to tools/schema/kml/ogckml22.xsd diff --git a/tools/kml22-schema/xAL.xsd b/tools/schema/kml/xAL.xsd similarity index 100% rename from tools/kml22-schema/xAL.xsd rename to tools/schema/kml/xAL.xsd diff --git a/tools/travis_install_linux_coverage b/tools/travis_install_linux_coverage deleted file mode 100755 index 2620ad494..000000000 --- a/tools/travis_install_linux_coverage +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -ex -# -# This script is run on travis for the install stage of mac builds. -# - -#debug failed install -function debug() { - cat ${CACHEDIR}/qt-${QT_VERSION}.env - find ${CACHEDIR}/Qt -maxdepth 3 -ls - cat ${CACHEDIR}/Qt/InstallationLog.txt - cat ${CACHEDIR}/Qt/components.xml - echo "$1" >&2 - exit 1 -} - -# validate install -function validate() { - ( - set +e - source ${CACHEDIR}/qt-${QT_VERSION}.env - if [ "$(qmake -query QT_INSTALL_BINS)" != "${QTDIR}/bin" ]; then - debug "ERROR: unexpected Qt location." - fi - if [ "$(qmake -query QT_VERSION)" != "${QT_VERSION}" ]; then - debug "ERROR: wrong Qt version." - fi - ) -} - -QT_VERSION=${1:-5.12.2} -QT_VERSION_SHORT=${QT_VERSION//./} - -# our expectation is that install-qt creates $QTDIR, $QTDIR/bin. -CACHEDIR=${HOME}/Cache -QTDIR=${CACHEDIR}/Qt/${QT_VERSION}/gcc_64 - -if [ -d "${QTDIR}/bin" ]; then - echo "Using cached Qt." - echo "If you need to clear the cache see" - echo "https://docs.travis-ci.com/user/caching/#Fetching-and-storing-caches." -else - rm -fr ${CACHEDIR} - mkdir -p ${CACHEDIR} - QT_CI_DOWNLOADER="wget -nv -c" PATH=${TRAVIS_BUILD_DIR}/tools/qtci:${PATH} install-qt-online "qt.qt5.${QT_VERSION_SHORT}.gcc_64" ${CACHEDIR} - echo "export PATH=${QTDIR}/bin:$PATH" > ${CACHEDIR}/qt-${QT_VERSION}.env - validate -fi diff --git a/tools/travis_install_linux_local b/tools/travis_install_linux_local deleted file mode 100755 index 9544a472a..000000000 --- a/tools/travis_install_linux_local +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -ex -# -# This script is run on travis for the install stage of mac builds. -# - -#debug failed install -function debug() { - cat ${CACHEDIR}/qt-${QT_VERSION}.env - find ${CACHEDIR}/Qt -maxdepth 3 -ls - cat ${CACHEDIR}/Qt/InstallationLog.txt - cat ${CACHEDIR}/Qt/components.xml - echo "$1" >&2 - exit 1 -} - -# validate install -function validate() { - ( - set +e - source ${CACHEDIR}/qt-${QT_VERSION}.env - if [ "$(qmake -query QT_INSTALL_BINS)" != "${QTDIR}/bin" ]; then - debug "ERROR: unexpected Qt location." - fi - if [ "$(qmake -query QT_VERSION)" != "${QT_VERSION}" ]; then - debug "ERROR: wrong Qt version." - fi - ) -} - -QT_VERSION=${1:-5.12.2} -QT_VERSION_SHORT=${QT_VERSION//./} - -# our expectation is that install-qt creates $QTDIR, $QTDIR/bin. -CACHEDIR=${HOME}/Cache -QTDIR=${CACHEDIR}/Qt/${QT_VERSION}/gcc_64 - -if [ -d "${QTDIR}/bin" ]; then - echo "Using cached Qt." - echo "If you need to clear the cache see" - echo "https://docs.travis-ci.com/user/caching/#Fetching-and-storing-caches." - if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then - # the cache is being used. modify it to reset expiration date. - date > ${CACHEDIR}/timestamp - fi - if [ -f "${CACHEDIR}/timestamp" ]; then - echo -n "Cache timestamp: " - cat "${CACHEDIR}/timestamp" - fi -else - rm -fr ${CACHEDIR} - mkdir -p ${CACHEDIR} - pushd ${CACHEDIR} - # install-qt creates the install at $PWD/Qt. - QT_CI_PACKAGES=qt.qt5.${QT_VERSION_SHORT}.gcc_64,qt.qt5.${QT_VERSION_SHORT}.qtwebengine QT_CI_DOWNLOADER="wget -nv -c" PATH=${TRAVIS_BUILD_DIR}/tools/qtci:${PATH} install-qt ${QT_VERSION} - popd - validate - rm ${CACHEDIR}/qt-opensource*.run -fi - -# prepare locale for test_encoding_latin1, requires locales package. -sudo rm -rf /var/lib/apt/lists/* \ - && sudo sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \ - && sudo locale-gen \ - && locale -a diff --git a/tpg.cc b/tpg.cc index 4e1e337ba..3fde1c2b7 100644 --- a/tpg.cc +++ b/tpg.cc @@ -22,16 +22,18 @@ */ +#include "tpg.h" + #include // for isalnum #include // for memcmp #include // for QChar #include // for QString -#include // for QVector #include "defs.h" -#include "gbfile.h" // for gbfwrite, gbfgetint16, gbfputint16, gbfclose -#include "jeeps/gpsmath.h" // for GPS_Lookup_Datum_Index, GPS_Math_Known_Da... +#include "gbfile.h" // for gbfwrite, gbfgetint16, gbfputint16, gbfclose, gbfgetdbl, gbfgetpstr, gbfopen_le, gbfputdbl, gbfgetint32, gbfputc, gbfputpstr, gbfread +#include "jeeps/gpsmath.h" // for GPS_Lookup_Datum_Index, GPS_Math_Known_Datum_To_WGS84_M, GPS_Math_WGS84_To_Known_Datum_M +#include "mkshort.h" // for MakeShort #define MYNAME "TPG" @@ -39,21 +41,8 @@ #define MAXTPGSTRINGSIZE 256 #define MAXTPGOUTPUTPINS 65535 -static gbfile* tpg_file_in; -static gbfile* tpg_file_out; -static short_handle mkshort_handle; -static char* tpg_datum_opt; -static int tpg_datum_idx; - -static unsigned int waypt_out_count; - -static -QVector tpg_args = { - {"datum", &tpg_datum_opt, "Datum (default=NAD27)", "N. America 1927 mean", ARGTYPE_STRING, ARG_NOMINMAX , nullptr}, -}; - -static int -valid_tpg_header(char* header, int len) +int +TpgFormat::valid_tpg_header(char* header, int len) { unsigned char header_bytes[] = { 0xFF, 0xFF, 0x01, 0x00, 0x0D, 0x00, 0x43, 0x54, 0x6F, 0x70, @@ -67,8 +56,8 @@ valid_tpg_header(char* header, int len) return memcmp(header_bytes, header, len); } -static void -tpg_common_init() +void +TpgFormat::tpg_common_init() { tpg_datum_idx = GPS_Lookup_Datum_Index(tpg_datum_opt); if (tpg_datum_idx < 0) { @@ -76,37 +65,37 @@ tpg_common_init() } } -static void -tpg_rd_init(const QString& fname) +void +TpgFormat::rd_init(const QString& fname) { tpg_common_init(); tpg_file_in = gbfopen_le(fname, "rb", MYNAME); } -static void -tpg_rd_deinit() +void +TpgFormat::rd_deinit() { gbfclose(tpg_file_in); } -static void -tpg_wr_init(const QString& fname) +void +TpgFormat::wr_init(const QString& fname) { tpg_common_init(); tpg_file_out = gbfopen_le(fname, "wb", MYNAME); - mkshort_handle = mkshort_new_handle(); + mkshort_handle = new MakeShort; waypt_out_count = 0; } -static void -tpg_wr_deinit() +void +TpgFormat::wr_deinit() { - mkshort_del_handle(&mkshort_handle); + delete mkshort_handle; gbfclose(tpg_file_out); } -static void -tpg_read() +void +TpgFormat::read() { char buff[MAXTPGSTRINGSIZE + 1]; double amt; @@ -168,10 +157,11 @@ tpg_read() } } -static void -tpg_waypt_pr(const Waypoint* wpt) +void +TpgFormat::tpg_waypt_pr(const Waypoint* wpt) { - double lon, lat; + double lon; + double lat; double amt; char ocount; QString shortname; @@ -188,7 +178,7 @@ tpg_waypt_pr(const Waypoint* wpt) if ((wpt->shortname.isEmpty()) || (global_opts.synthesize_shortnames)) { if (!wpt->description.isEmpty()) { if (global_opts.synthesize_shortnames) { - shortname = mkshort_from_wpt(mkshort_handle, wpt); + shortname = mkshort_handle->mkshort_from_wpt(wpt); } else { shortname = wpt->description; } @@ -279,8 +269,8 @@ tpg_waypt_pr(const Waypoint* wpt) } } -static void -tpg_write() +void +TpgFormat::write() { unsigned char header_bytes[] = { 0xFF, 0xFF, 0x01, 0x00, 0x0D, 0x00, 0x43, 0x54, 0x6F, 0x70, @@ -291,9 +281,9 @@ tpg_write() int s = waypt_count(); if (global_opts.synthesize_shortnames) { - setshort_length(mkshort_handle, 32); - setshort_whitespace_ok(mkshort_handle, 1); - setshort_mustupper(mkshort_handle, 1); + mkshort_handle->set_length(32); + mkshort_handle->set_whitespace_ok(true); + mkshort_handle->set_mustupper(true); } if (s > MAXTPGOUTPUTPINS) { @@ -306,19 +296,8 @@ tpg_write() /* write the rest of the header */ gbfwrite(header_bytes, 1, 19, tpg_file_out); - waypt_disp_all(tpg_waypt_pr); + auto tpg_waypt_pr_lambda = [this](const Waypoint* waypointp)->void { + tpg_waypt_pr(waypointp); + }; + waypt_disp_all(tpg_waypt_pr_lambda); } - -ff_vecs_t tpg_vecs = { - ff_type_file, - FF_CAP_RW_WPT, - tpg_rd_init, - tpg_wr_init, - tpg_rd_deinit, - tpg_wr_deinit, - tpg_read, - tpg_write, - nullptr, - &tpg_args, - NULL_POS_OPS -}; diff --git a/tpg.h b/tpg.h new file mode 100644 index 000000000..0fa129b3b --- /dev/null +++ b/tpg.h @@ -0,0 +1,84 @@ +/* + National Geographic Topo! TPG file support (Waypoints/Routes) + Contributed to gpsbabel by Alex Mottram + + For Topo! version 2.x. Routes are currently not implemented. + + Copyright (C) 2002 Alex Mottram, geo_alexm at cox-internet.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + */ +#ifndef TPG_H_INCLUDED_ +#define TPG_H_INCLUDED_ + +#include // for QString +#include // for QVector + +#include "defs.h" +#include "format.h" // for Format +#include "gbfile.h" // for gbfile +#include "mkshort.h" // for MakeShort + + +class TpgFormat : public Format +{ +public: + using Format::Format; + + QVector* get_args() override + { + return &tpg_args; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + return FF_CAP_RW_WPT; + } + + void rd_init(const QString& fname) override; + void read() override; + void rd_deinit() override; + void wr_init(const QString& fname) override; + void write() override; + void wr_deinit() override; + +private: + /* Member Functions */ + + static int valid_tpg_header(char* header, int len); + void tpg_common_init(); + void tpg_waypt_pr(const Waypoint* wpt); + + /* Data Members */ + + gbfile* tpg_file_in{}; + gbfile* tpg_file_out{}; + MakeShort* mkshort_handle{}; + char* tpg_datum_opt{}; + int tpg_datum_idx{}; + + int waypt_out_count{}; + + QVector tpg_args = { + {"datum", &tpg_datum_opt, "Datum (default=NAD27)", "N. America 1927 mean", ARGTYPE_STRING, ARG_NOMINMAX, nullptr}, + }; +}; +#endif // TPG_H_INCLUDED_ diff --git a/tpo.cc b/tpo.cc index dd5a7ab7b..6b8e43c6a 100644 --- a/tpo.cc +++ b/tpo.cc @@ -69,9 +69,11 @@ 3.x "recreation" */ -#include // for abs +#include "tpo.h" + #include // for uint8_t #include // for printf, SEEK_CUR, SEEK_SET +#include // for abs #include // for strlen, strncmp #include // for vector @@ -79,41 +81,24 @@ #include // for QScopedArrayPointer #include // for QString #include // for qMakeStringPrivate, QStringLiteral -#include // for QVector #include // for qPrintable, Q_UNUSED -#include "defs.h" -#include "gbfile.h" // for gbfread, gbfgetc, gbfgetint32, gbfreadbuf, gbfseek, gbfgetdbl, gbfgetint16, gbfclose, gbfgetnativecstr, gbfgetuint16, gbfopen_le, gbfile +#include "defs.h" // for Waypoint, fatal, route_head, le_read32, waypt_add, track_add_wpt, track_add_head, doing_rtes, doing_wpts, gb_color, route_add_head, route_add_wpt, unknown_alt, doing_trks +#include "gbfile.h" // for gbfread, gbfgetc, gbfgetint32, gbfreadbuf, gbfseek, gbfgetdbl, gbfgetint16, gbfclose, gbfgetnativecstr, gbfgetuint16, gbfopen_le #include "jeeps/gpsmath.h" // for GPS_Math_Known_Datum_To_WGS84_M #define MYNAME "TPO" -static char* dumpheader = nullptr; - -static -QVector tpo2_args = { -}; - -static -QVector tpo3_args = { -}; - - -static gbfile* tpo_file_in; -static double track_length; /*******************************************************************************/ /* READ */ /*******************************************************************************/ -/* Define a global here that we can query from multiple places */ -static float tpo_version = 0.0; - /* tpo_check_version_string() Check the first bytes of the file for a version 3.0 header. */ -static void -tpo_check_version_string() +void +TpoFormatBase::tpo_check_version_string() { unsigned char string_size; @@ -142,11 +127,11 @@ tpo_check_version_string() } } -static void /* tpo_dump_header_bytes(int header_size) Write the first header_size bytes of the file to standard output as a C array definition. */ -tpo_dump_header_bytes(int header_size) +void +TpoFormatBase::tpo_dump_header_bytes(int header_size) { QByteArray buffer = gbfreadbuf(header_size, tpo_file_in); @@ -172,8 +157,8 @@ tpo_dump_header_bytes(int header_size) Keep reading bytes from the file until the section name is encountered, then go seek_bytes forwards (+) or backwards (-) to the start of the section data. */ -static void -tpo_read_until_section(const char* section_name, int seek_bytes) +void +TpoFormatBase::tpo_read_until_section(const char* section_name, int seek_bytes) { char byte; unsigned int match_index = 0; @@ -220,7 +205,7 @@ tpo_read_until_section(const char* section_name, int seek_bytes) // that is the only type of data available in the version 2.x TPO // files. // -static void tpo_read_2_x() +void TpoFormatBase::tpo_read_2_x() { char buff[16]; @@ -335,7 +320,7 @@ static void tpo_read_2_x() // // For version 3.x files. // -static int tpo_read_int() +int TpoFormatBase::tpo_read_int() { constexpr int debug = 0; @@ -381,7 +366,7 @@ static int tpo_read_int() // // For version 3.x/4.x files. // -static int tpo_find_block(unsigned int block_desired) +int TpoFormatBase::tpo_find_block(unsigned int block_desired) { unsigned int block_type; constexpr int debug = 0; @@ -419,7 +404,7 @@ static int tpo_find_block(unsigned int block_desired) // // For version 3.x files. // -static Waypoint* tpo_convert_ll(int lat, int lon) +Waypoint* TpoFormatBase::tpo_convert_ll(int lat, int lon) { auto* waypoint_temp = new Waypoint; @@ -453,19 +438,9 @@ static Waypoint* tpo_convert_ll(int lat, int lon) return (waypoint_temp); } -#define TRACKNAMELENGTH 255 -class StyleInfo -{ -public: - QString name; - uint8_t color[3] {0, 0, 0}; // keep R/G/B values separate because line_color needs BGR - uint8_t wide{0}; - uint8_t dash{0}; -}; - // Track decoder for version 3.x/4.x files. // This block contains tracks (called "freehand routes" in Topo). -static void tpo_process_tracks() +void TpoFormatBase::tpo_process_tracks() { constexpr int debug = 0; // 0-4 for increasingly verbose output in this subroutine) @@ -611,7 +586,7 @@ static void tpo_process_tracks() track_style -= 1; // STARTS AT 1, whereas style arrays start at 0 // Can be 8/16/32-bit value - never used? length in meters? - track_length = tpo_read_int(); + double track_length = tpo_read_int(); //UNKNOWN DATA LENGTH unsigned int name_length = tpo_read_int(); @@ -721,8 +696,8 @@ static void tpo_process_tracks() */ // Read the track bytes into a buffer - auto* buf = (unsigned char*) xmalloc(track_byte_count); - gbfread(buf, 1, track_byte_count, tpo_file_in); + QScopedArrayPointer buf(new unsigned char[track_byte_count]); + gbfread(buf.get(), 1, track_byte_count, tpo_file_in); // these can be set repeatedly, and retain their value between settings // (even if not used for every trackpoint) @@ -759,13 +734,13 @@ static void tpo_process_tracks() // Time to read a new latlong? if (!llvalid) { - lon = le_read32(buf+jj); + lon = le_read32(&buf[jj]); if constexpr(debug > 3) { printf("%02x %02x %02x %02x - raw lon = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], lon,jj); } jj+=4; - lat = le_read32(buf+jj); + lat = le_read32(&buf[jj]); if constexpr(debug > 3) { printf("%02x %02x %02x %02x - raw lat = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], lat,jj); } @@ -781,7 +756,7 @@ static void tpo_process_tracks() && !buf[jj+3] && !buf[jj+2]) { - lonscale = le_read32(buf+jj); + lonscale = le_read32(&buf[jj]); if constexpr(debug > 3) { printf("%02x %02x %02x %02x - raw lon scale = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], lonscale, jj); } @@ -797,7 +772,7 @@ static void tpo_process_tracks() && !buf[jj+3] && !buf[jj+2]) { - latscale = le_read32(buf+jj); + latscale = le_read32(&buf[jj]); if constexpr(debug > 3) { printf("%02x %02x %02x %02x - raw lat scale = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], latscale, jj); } @@ -822,13 +797,13 @@ static void tpo_process_tracks() // read 8-byte lon+lat, required at start of track or after 0x88 tag if (tpmode == GetFullPoint) { - lon = le_read32(buf+jj); + lon = le_read32(&buf[jj]); if constexpr(debug > 3) { printf("%02x %02x %02x %02x - raw lon = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], lon,jj); } jj+=4; - lat = le_read32(buf+jj); + lat = le_read32(&buf[jj]); if constexpr(debug > 3) { printf("%02x %02x %02x %02x - raw lat = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], lat,jj); } @@ -861,7 +836,7 @@ static void tpo_process_tracks() // Note that lonscale can begin with 0x88, which should not be confused with GetFullPoint tags. if (tpmode == CheckLonScale) { if ((jj+3 3) { printf("%02x %02x %02x %02x - raw lon scale = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], lonscale, jj); } @@ -880,7 +855,7 @@ static void tpo_process_tracks() // Note that latscale can begin with 0x88, which should not be confused with GetFullPoint tags. if (tpmode == CheckLatScale) { if ((jj+3 3) { printf("%02x %02x %02x %02x - raw lat scale = %d (byte %u)\n", buf[jj], buf[jj+1], buf[jj+2], buf[jj+3], latscale, jj); } @@ -1034,22 +1009,13 @@ static void tpo_process_tracks() #endif } // end for jj track_byte_count - xfree(buf); } // end for ii track_count } // end of tpo_process_tracks -// Global index to waypoints, needed for routes, filled in by -// tpo_process_waypoints. -// -// For version 3.x files. -// -static Waypoint** tpo_wp_index; -static unsigned int tpo_index_ptr; - // Waypoint decoder for version 3.x files. // -static void tpo_process_waypoints() +void TpoFormatBase::tpo_process_waypoints(QList& tpo_wp_index) { //printf("Processing Waypoints...\n"); @@ -1065,8 +1031,8 @@ static void tpo_process_waypoints() // Fetch storage for the waypoint index (needed later for // routes) - tpo_wp_index = (Waypoint**) xmalloc(sizeof(Waypoint*) * waypoint_count); - tpo_index_ptr = 0; + tpo_wp_index.clear(); + tpo_wp_index.reserve(waypoint_count); if (waypoint_count == 0) { return; @@ -1125,10 +1091,8 @@ static void tpo_process_waypoints() // For routes (later), we need a duplicate of each waypoint // indexed by the order we read them in. - auto* waypoint_temp2 = new Waypoint(*waypoint_temp); - - // Attach the copy to our index - tpo_wp_index[tpo_index_ptr++] = waypoint_temp2; + // Attach a copy to our index. + tpo_wp_index.append(*waypoint_temp); // Add the original waypoint to the chain of waypoints waypt_add(waypoint_temp); @@ -1157,7 +1121,7 @@ static void tpo_process_waypoints() // Map Notes decoder for version 3.x files. // -static void tpo_process_map_notes() +void TpoFormatBase::tpo_process_map_notes() { //printf("Processing Map Notes...\n"); @@ -1255,7 +1219,7 @@ static void tpo_process_map_notes() // Symbols decoder for version 3.x files. // -static void tpo_process_symbols() +void TpoFormatBase::tpo_process_symbols() { //printf("Processing Symbols...\n"); @@ -1298,7 +1262,7 @@ static void tpo_process_symbols() // Text Labels decoder for version 3.x files. // -static void tpo_process_text_labels() +void TpoFormatBase::tpo_process_text_labels() { //printf("Processing Text Labels...\n"); @@ -1358,11 +1322,11 @@ static void tpo_process_text_labels() // Route decoder for version 3.x files. // -// We depend on tpo_wp_index[] having been malloc'ed and filled-in -// with pointers to waypoint objects by tpo_process_waypoints() +// We depend on tpo_wp_index having been filled-in +// with waypoint objects by the tpo_process_waypoints() // function above. // -static void tpo_process_routes() +void TpoFormatBase::tpo_process_routes(const QList& tpo_wp_index) { //printf("Processing Routes...\n"); @@ -1430,7 +1394,7 @@ static void tpo_process_routes() //printf("val: %x\t\t", val); // Duplicate a waypoint from our index of waypoints. - auto* waypoint_temp = new Waypoint(*tpo_wp_index[val-1]); + auto* waypoint_temp = new Waypoint(tpo_wp_index[val-1]); // Add the waypoint to the route route_add_wpt(route_temp, waypoint_temp); @@ -1446,7 +1410,7 @@ static void tpo_process_routes() #ifdef DEAD_CODE_IS_REBORN // Compass decoder for version 3.x files. // -static void tpo_process_compass() +void TpoFormatBase::tpo_process_compass() { // Not implemented yet @@ -1461,8 +1425,13 @@ static void tpo_process_compass() // (called "freehand routes" or just "routes" in Topo), "waypoints", // and "gps-routes". We intend to read all three types. // -static void tpo_read_3_x() +void TpoFormatBase::tpo_read_3_x() { + // Global index to waypoints, needed for routes, filled in by + // tpo_process_waypoints. + // + // For version 3.x files. + QList tpo_wp_index; if (doing_trks) { //printf("Processing Tracks\n"); @@ -1471,7 +1440,7 @@ static void tpo_read_3_x() if (doing_wpts || doing_rtes) { //printf("Processing Waypoints\n"); - tpo_process_waypoints(); + tpo_process_waypoints(tpo_wp_index); } if (doing_rtes) { @@ -1481,7 +1450,7 @@ static void tpo_read_3_x() // for routes. // //printf("Processing Routes\n"); - tpo_process_routes(); + tpo_process_routes(tpo_wp_index); } if (doing_wpts) { @@ -1517,15 +1486,9 @@ static void tpo_read_3_x() -static void -tpo_rd_init(const QString& fname) +void +TpoFormatBase::tpo_rd_init(const QString& fname) { - - // prepare for an attempt to deallocate memory that may or may not get allocated - // depending on the options used. - tpo_index_ptr = 0; - tpo_wp_index = nullptr; - tpo_file_in = gbfopen_le(fname, "rb", MYNAME); tpo_check_version_string(); @@ -1547,26 +1510,14 @@ tpo_rd_init(const QString& fname) } } -static void -tpo_rd_deinit() +void +TpoFormatBase::tpo_rd_deinit() { - // Free the waypoint index, we don't need it anymore. - for (unsigned int i = 0; i < tpo_index_ptr; i++) { - delete tpo_wp_index[i]; - } - tpo_index_ptr = 0; - - // Free the index array itself - if (tpo_wp_index) { - xfree(tpo_wp_index); - tpo_wp_index = nullptr; - } - gbfclose(tpo_file_in); } -static void -tpo_read() +void +TpoFormatBase::tpo_read() { if (tpo_version == 2.0) { @@ -1579,33 +1530,3 @@ tpo_read() fatal(MYNAME ": gpsbabel can only read TPO versions through 3.x.x\n"); } } - -/* TPO 2.x format can read tracks only */ -ff_vecs_t tpo2_vecs = { - ff_type_file, /* ff_type_internal */ - { ff_cap_none, ff_cap_read, ff_cap_none }, - tpo_rd_init, - nullptr, - tpo_rd_deinit, - nullptr, - tpo_read, - nullptr, - nullptr, - &tpo2_args, - NULL_POS_OPS -}; - -/* TPO 3.x format can read waypoints/tracks/routes */ -ff_vecs_t tpo3_vecs = { - ff_type_file, /* ff_type_internal */ - { ff_cap_read, ff_cap_read, ff_cap_read }, - tpo_rd_init, - nullptr, - tpo_rd_deinit, - nullptr, - tpo_read, - nullptr, - nullptr, - &tpo3_args, - NULL_POS_OPS -}; diff --git a/tpo.h b/tpo.h new file mode 100644 index 000000000..e390cb397 --- /dev/null +++ b/tpo.h @@ -0,0 +1,197 @@ +/* + National Geographic Topo! TPO file support. + 2.x support contributed to gpsbabel by Steve Chamberlin. + 3.x support contributed to gpsbabel by Curt Mills. + 4.x files read properly when treated as 3.x (final release was 4.5) + track parsing bugs fixed by Steve Eckert in 2012 and 2020 + + Topo! version 2.x: Tracks are implemented. + Topo! version 3.x/4.x: Reading of Tracks/Waypoints/Routes is + implemented. Also extracts Map Notes/ + Symbols/Text Labels as Waypoints. + + Copyright (C) 2005 Steve Chamberlin, slc at alum.mit.edu + Portions Copyright (C) 2006 Curtis E. Mills, archer at eskimo dot com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + */ + +/* + TPO format notes: + ----------------- + Most of the ASCII strings embedded in the text will have a + byte-count prepended to the string. Unknown yet whether other + fields have this same byte-count, but so far it doesn't look like + it. + + New format (3.x and later) files begin with a string byte-count + byte and then a string starting with "TOPO! Ver. 3.", like "TOPO! + Ver. 3.3.4". Can contain routes/tracks/waypoints, embedded + images, Map Notes, Symbols, Text Labels, Compass symbols, and + several others. + + Older (pre-3.0) format does not have the above string. Contains + only tracks. Waypoints are saved in a separate .TPG file. + + Track parsing has been problematic and may still not be right! + See further notes and clues in tpo_process_tracks() + (can #define Tracks2012 to revert to pre-2020 code in tpo_process_tracks) + + May contain these strings: + Frmt: String: + ----- -------------------------------- + 2.x "CTopoAzimuth" + 2.x "CTopoBookmark" + 2.x "CTopoGpsRoute". Saved in .tpg files (see tpg.c) + 2.x "CTopoRoute". The actual tracks we parse here. + 2.x "CTopoSymbol" + 2.x/3.x "CTopoText" + 2.x "CTopoWaypoint". Saved in .tpg files (see tpg.c) + 3.x "Notes" + 3.x "PNG." Embedded PNG image containing 2 rows of 40 + symbols each. Starts with signature: 89 50 4e 47 0d + 0a 1a 0a, ends with signature 49 45 4e 44 ae 42 60 82. + 3.x "shapes" + 3.x "arrows" + 3.x "recreation" +*/ +#ifndef TPO_H_INCLUDED_ +#define TPO_H_INCLUDED_ + +#include // for QList +#include // for QString +#include // for QVector +#include // for uint8_t +#include "defs.h" // for ff_cap, arglist_t, ff_cap_none, ff_cap_read, Waypoint, ff_type, ff_type_file +#include "format.h" // for Format +#include "gbfile.h" // for gbfile + + +class TpoFormatBase +{ +protected: + /* Constants */ + + static constexpr int TRACKNAMELENGTH = 255; + + /* Types */ + + class StyleInfo + { + public: + QString name; + uint8_t color[3] {0, 0, 0}; // keep R/G/B values separate because line_color needs BGR + uint8_t wide{0}; + uint8_t dash{0}; + }; + + /* Member Functions */ + + void tpo_check_version_string(); + void tpo_dump_header_bytes(int header_size); + void tpo_read_until_section(const char* section_name, int seek_bytes); + void tpo_read_2_x(); + int tpo_read_int(); + int tpo_find_block(unsigned int block_desired); + static Waypoint* tpo_convert_ll(int lat, int lon); + void tpo_process_tracks(); + void tpo_process_waypoints(QList& tpo_wp_index); + void tpo_process_map_notes(); + void tpo_process_symbols(); + void tpo_process_text_labels(); + void tpo_process_routes(const QList& tpo_wp_index); + void tpo_read_3_x(); + void tpo_rd_init(const QString& fname); + void tpo_rd_deinit(); + void tpo_read(); + + /* Data Members */ + + char* dumpheader = nullptr; + gbfile* tpo_file_in{}; + + // Define a global here that we can query from multiple places. + float tpo_version = 0.0; +}; + +class Tpo2Format : public Format, private TpoFormatBase +{ +public: + QVector* get_args() override + { + return nullptr; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + /* TPO 2.x format can read tracks only */ + /* waypoints, tracks, routes */ + return { ff_cap_none, ff_cap_read, ff_cap_none }; + } + + void rd_init(const QString& fname) override + { + tpo_rd_init(fname); + } + void read() override + { + tpo_read(); + } + void rd_deinit() override + { + tpo_rd_deinit(); + } +}; + +class Tpo3Format : public Format, private TpoFormatBase +{ +public: + QVector* get_args() override + { + return nullptr; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + /* TPO 3.x format can read waypoints/tracks/routes */ + /* waypoints, tracks, routes */ + return { ff_cap_read, ff_cap_read, ff_cap_read }; + } + + void rd_init(const QString& fname) override + { + tpo_rd_init(fname); + } + void read() override + { + tpo_read(); + } + void rd_deinit() override + { + tpo_rd_deinit(); + } +}; +#endif // TPO_H_INCLUDED_ diff --git a/trackfilter.cc b/trackfilter.cc index 1c3dd1384..06f7c8bf3 100644 --- a/trackfilter.cc +++ b/trackfilter.cc @@ -30,6 +30,7 @@ static constexpr bool TRACKF_DBG = false; #include // for strlen, strchr, strcmp #include // for gmtime, strftime, time_t, tm #include // for next +#include // for as_const #include // for QByteArray #include // for QChar @@ -41,7 +42,7 @@ static constexpr bool TRACKF_DBG = false; #include // for QRegularExpressionMatch #include // for QString #include // for UTC, CaseInsensitive -#include // for qAsConst, foreach, qPrintable, QAddConst<>::Type, qint64 +#include // for foreach, qPrintable, QAddConst<>::Type, qint64 #include "defs.h" #include "trackfilter.h" @@ -62,7 +63,7 @@ int TrackFilter::trackfilter_opt_count() { int res = 0; - for (const auto& arg : qAsConst(args)) { + for (const auto& arg : std::as_const(args)) { if (*arg.argval != nullptr) { res++; } @@ -296,7 +297,7 @@ void TrackFilter::trackfilter_title() if (strlen(opt_title) == 0) { fatal(MYNAME "-title: Missing your title!\n"); } - for (auto* track : qAsConst(track_list)) { + for (auto* track : std::as_const(track_list)) { trackfilter_pack_init_rte_name(track, QDateTime::fromMSecsSinceEpoch(0, Qt::UTC)); } } @@ -308,7 +309,8 @@ void TrackFilter::trackfilter_title() void TrackFilter::trackfilter_pack() { if (!track_list.isEmpty()) { - int i, j; + int i; + int j; for (i = 1, j = 0; i < track_list.size(); i++, j++) { auto prev_last_time = trackfilter_get_last_time(track_list.at(j)); @@ -358,8 +360,8 @@ void TrackFilter::trackfilter_merge() QList buff; - auto it = track_list.begin(); - while (it != track_list.end()) { /* put all points into temp buffer */ + auto it = track_list.cbegin(); + while (it != track_list.cend()) { /* put all points into temp buffer */ route_head* track = *it; // steal all the wpts WaypointList wpts; @@ -376,9 +378,9 @@ void TrackFilter::trackfilter_merge() delete wpt; } } - if (it != track_list.begin()) { + if (it != track_list.cbegin()) { track_del_head(track); - it = track_list.erase(it); + it = static_cast(track_list.erase(it)); } else { ++it; } @@ -529,8 +531,7 @@ void TrackFilter::trackfilter_split() if (distance > 0) { double curdist = radtometers( - gcdist(RAD(prev_wpt->latitude), RAD(prev_wpt->longitude), - RAD(wpt->latitude), RAD(wpt->longitude))); + gcdist(prev_wpt->position(), wpt->position())); if (curdist <= distance) { new_track_flag = false; } else if constexpr(TRACKF_DBG) { @@ -576,7 +577,7 @@ void TrackFilter::trackfilter_move() int timeless_points = 0; - for (auto* track : qAsConst(track_list)) { + for (auto* track : std::as_const(track_list)) { foreach (Waypoint* wpt, track->waypoint_list) { if (wpt->creation_time.isValid()) { wpt->creation_time = wpt->creation_time.addMSecs(delta); @@ -598,16 +599,14 @@ void TrackFilter::trackfilter_move() void TrackFilter::trackfilter_synth() { - double last_course_lat; - double last_course_lon; - double last_speed_lat = std::nan(""); /* Quiet gcc 7.3.0 -Wmaybe-uninitialized */ - double last_speed_lon = std::nan(""); /* Quiet gcc 7.3.0 -Wmaybe-uninitialized */ + PositionDeg last_course_pos; + PositionDeg last_speed_pos; gpsbabel::DateTime last_speed_time; int nsats = 0; fix_type fix = trackfilter_parse_fix(&nsats); - for (auto* track : qAsConst(track_list)) { + for (auto* track : std::as_const(track_list)) { bool first = true; foreach (Waypoint* wpt, track->waypoint_list) { if (opt_fix) { @@ -624,18 +623,14 @@ void TrackFilter::trackfilter_synth() wpt->reset_speed(); } first = false; - last_course_lat = wpt->latitude; - last_course_lon = wpt->longitude; - last_speed_lat = wpt->latitude; - last_speed_lon = wpt->longitude; + last_course_pos = wpt->position(); + last_speed_pos = wpt->position(); last_speed_time = wpt->GetCreationTime(); } else { if (opt_course) { - wpt->set_course(heading_true_degrees(RAD(last_course_lat), - RAD(last_course_lon),RAD(wpt->latitude), - RAD(wpt->longitude))); - last_course_lat = wpt->latitude; - last_course_lon = wpt->longitude; + wpt->set_course(heading_true_degrees(last_course_pos, + wpt->position())); + last_course_pos = wpt->position(); } if (opt_speed) { if (last_speed_time.msecsTo(wpt->GetCreationTime()) != 0) { @@ -647,14 +642,11 @@ void TrackFilter::trackfilter_synth() // Note that points with the same time can occur because the input // has truncated times, or because we are truncating times with // toTime_t(). - wpt->set_speed(radtometers(gcdist( - RAD(last_speed_lat), RAD(last_speed_lon), - RAD(wpt->latitude), - RAD(wpt->longitude))) / + wpt->set_speed(radtometers(gcdist(last_speed_pos, wpt->position())) + / (0.001 * std::abs(last_speed_time.msecsTo(wpt->GetCreationTime()))) ); - last_speed_lat = wpt->latitude; - last_speed_lon = wpt->longitude; + last_speed_pos = wpt->position(); last_speed_time = wpt->GetCreationTime(); } else { wpt->reset_speed(); @@ -683,7 +675,7 @@ QDateTime TrackFilter::trackfilter_range_check(const char* timestr) QRegularExpressionMatch match = re.match(fmtstart); if (match.hasMatch()) { // QTime::fromString zzz expects exactly 3 digits representing milliseconds. - result = QDateTime::fromString(match.captured(0), "yyyyMMddHHmmss.zzz"); + result = QDateTime::fromString(match.captured(0), u"yyyyMMddHHmmss.zzz"); result.setTimeSpec(Qt::UTC); if (!result.isValid()) { fatal(MYNAME "-range-check: Invalid timestamp \"%s\"!\n", timestr); @@ -701,7 +693,8 @@ QDateTime TrackFilter::trackfilter_range_check(const char* timestr) void TrackFilter::trackfilter_range() { - QDateTime start, stop; // constructed such that isValid() is false, unlike gpsbabel::DateTime! + QDateTime start; // constructed such that isValid() is false, unlike gpsbabel::DateTime! + QDateTime stop; // constructed such that isValid() is false, unlike gpsbabel::DateTime! if (opt_start != nullptr) { start = trackfilter_range_check(opt_start); @@ -713,8 +706,8 @@ void TrackFilter::trackfilter_range() int original_waypt_count = track_waypt_count(); - auto it = track_list.begin(); - while (it != track_list.end()) { + auto it = track_list.cbegin(); + while (it != track_list.cend()) { route_head* track = *it; foreach (Waypoint* wpt, track->waypoint_list) { @@ -738,7 +731,7 @@ void TrackFilter::trackfilter_range() if (track->rte_waypt_empty()) { track_del_head(track); - it = track_list.erase(it); + it = static_cast(track_list.erase(it)); } else { ++it; } @@ -757,7 +750,7 @@ void TrackFilter::trackfilter_seg2trk() { if (!track_list.isEmpty()) { QList new_track_list; - for (auto* src : qAsConst(track_list)) { + for (auto* src : std::as_const(track_list)) { new_track_list.append(src); route_head* dest = src; route_head* insert_point = src; @@ -840,7 +833,7 @@ TrackFilter::faketime_t TrackFilter::trackfilter_faketime_check(const char* time QString start = match.captured(2); QString fmtstart("00000101000000"); fmtstart.replace(0, start.size(), start); - result.start = QDateTime::fromString(fmtstart, "yyyyMMddHHmmss"); + result.start = QDateTime::fromString(fmtstart, u"yyyyMMddHHmmss"); result.start.setTimeSpec(Qt::UTC); if (!result.start.isValid()) { fatal(MYNAME "-faketime-check: Invalid timestamp \"%s\"!\n", qPrintable(start)); @@ -871,7 +864,7 @@ void TrackFilter::trackfilter_faketime() assert(opt_faketime != nullptr); faketime_t faketime = trackfilter_faketime_check(opt_faketime); - for (auto* track : qAsConst(track_list)) { + for (auto* track : std::as_const(track_list)) { foreach (Waypoint* wpt, track->waypoint_list) { if (!wpt->creation_time.isValid() || faketime.force) { @@ -885,10 +878,7 @@ void TrackFilter::trackfilter_faketime() bool TrackFilter::trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb) { return - radtometers(gcdist(RAD(wpta->latitude), - RAD(wpta->longitude), - RAD(wptb->latitude), - RAD(wptb->longitude))) < kDistanceLimit && + radtometers(gcdist(wpta->position(), wptb->position())) < kDistanceLimit && std::abs(wpta->altitude - wptb->altitude) < 20 && wpta->courses_equal(*wptb) && wpta->speeds_equal(*wptb) && @@ -906,10 +896,8 @@ void TrackFilter::trackfilter_segment_head(const route_head* rte) for (auto it = wptlist.cbegin(); it != wptlist.cend(); ++it) { auto* wpt = *it; if (it != wptlist.cbegin()) { - double cur_dist = radtometers(gcdist(RAD(prev_wpt->latitude), - RAD(prev_wpt->longitude), - RAD(wpt->latitude), - RAD(wpt->longitude))); + double cur_dist = radtometers(gcdist(prev_wpt->position(), + wpt->position())); // Denoise points that are on top of each other, // keeping the first and last of the group. diff --git a/unicsv.cc b/unicsv.cc index 480616934..53b00a27e 100644 --- a/unicsv.cc +++ b/unicsv.cc @@ -24,6 +24,7 @@ #include // for fabs, lround #include // for NULL, sscanf #include // for tm +#include // for as_const #include // for QByteArray #include // for QChar @@ -42,10 +43,10 @@ #include "defs.h" #include "csv_util.h" // for csv_linesplit, human_to_dec #include "formspec.h" // for FormatSpecificDataList -#include "garmin_fs.h" // for garmin_fs_flags_t, garmin_fs_t, GMSD_GET, GMSD_HAS, GMSD_SETQSTR, GMSD_FIND, garmin_fs_alloc +#include "garmin_fs.h" // for garmin_fs_t #include "garmin_tables.h" // for gt_lookup_datum_index, gt_get_mps_grid_longname, gt_lookup_grid_type #include "geocache.h" // for Geocache, Geocache::status_t, Geoc... -#include "jeeps/gpsmath.h" // for GPS_Math_UKOSMap_To_WGS84_M, GPS_Math_EN_To_UKOSNG_Map, GPS_Math_Known_Datum_To_UTM_EN, GPS_Math_Known_Datum_To_WGS84_M, GPS_Math_Swiss_EN_To_WGS84, GPS_Math_UTM_EN_To_Known_Datum, GPS_Math_WGS84_To_Known_Datum_M, GPS_Math_WGS84_To_Swiss_EN, GPS_Math_WGS... +#include "jeeps/gpsmath.h" // for GPS_Math_UKOSMap_To_WGS84_H, GPS_Math_EN_To_UKOSNG_Map, GPS_Math_Known_Datum_To_UTM_EN, GPS_Math_Known_Datum_To_WGS84_M, GPS_Math_Swiss_EN_To_WGS84, GPS_Math_UTM_EN_To_Known_Datum, GPS_Math_WGS84_To_Known_Datum_M, GPS_Math_WGS84_To_Swiss_EN, GPS_Math_WGS... #include "session.h" // for session_t #include "src/core/datetime.h" // for DateTime #include "src/core/logging.h" // for Warning, Fatal @@ -156,7 +157,6 @@ const UnicsvFormat::field_t UnicsvFormat::fields_def[] = { { "diff", fld_gc_diff, kStrAny }, { "arch", fld_gc_is_archived, kStrAny }, { "avail", fld_gc_is_available, kStrAny }, - { "exported", fld_gc_exported, kStrAny }, { "found", fld_gc_last_found, kStrAny }, { "placer_id", fld_gc_placer_id, kStrAny }, { "placer", fld_gc_placer, kStrAny }, @@ -208,7 +208,7 @@ UnicsvFormat::unicsv_parse_gc_code(const QString& str) } long long res = 0; - for (auto c : qAsConst(s)) { + for (auto c : std::as_const(s)) { int val = kBase31.indexOf(c); if (val < 0 || (base == 16 && val > 15)) { return 0; @@ -227,7 +227,9 @@ UnicsvFormat::unicsv_parse_gc_code(const QString& str) QDate UnicsvFormat::unicsv_parse_date(const char* str, int* consumed) { - int p1, p2, p3; + int p1; + int p2; + int p3; char sep[2]; std::tm tm{}; int lconsumed = 0; @@ -383,19 +385,27 @@ void UnicsvFormat::unicsv_fondle_header(QString header) { /* Convert the entire header to lower case for convenience. - * If we see a tab in that header, we decree it to be tabsep. */ - unicsv_fieldsep = ","; - if (header.contains('\t')) { - unicsv_fieldsep = "\t"; - } else if (header.contains(';')) { - unicsv_fieldsep = ";"; - } else if (header.contains('|')) { - unicsv_fieldsep = "|"; - } header = header.toLower(); - const QStringList values = csv_linesplit(header, unicsv_fieldsep, "\"", 0, CsvQuoteMethod::rfc4180); + /* Find the separator and split the line into fields. + * If we see an unenclosd tab that is the separator. + * Otherwise, if we see an unenclosed semicolon that is the separator. + * Otherwise, if we see an unenclosed vertical bar that is the separator. + * Otherwise the separator is a comma. + */ + const QList delimiters = {"\t", ";", "|", ","}; + unicsv_fieldsep = delimiters.last(); + QStringList values; + bool delimiter_detected; + for (const auto* delimiter : delimiters) { + values = csv_linesplit(header, delimiter, kUnicsvQuoteChar, unicsv_lineno, CsvQuoteMethod::rfc4180, &delimiter_detected); + if (delimiter_detected) { + unicsv_fieldsep = delimiter; + break; + } + } + for (auto value : values) { value = value.trimmed(); @@ -409,8 +419,12 @@ UnicsvFormat::unicsv_fondle_header(QString header) } f++; } - if ((f->name.isEmpty()) && global_opts.debug_level) { - warning(MYNAME ": Unhandled column \"%s\".\n", qPrintable(value)); + if (global_opts.debug_level) { + if ((f->name.isEmpty()) && global_opts.debug_level) { + warning(MYNAME ": Unhandled column \"%s\".\n", qPrintable(value)); + } else { + warning(MYNAME ": Interpreting column \"%s\" as %s(%d).\n", qPrintable(value), qPrintable(f->name), f->type); + } } /* handle some special items */ @@ -454,10 +468,12 @@ UnicsvFormat::rd_init(const QString& fname) fin = new gpsbabel::TextStream; fin->open(fname, QIODevice::ReadOnly, MYNAME, opt_codec); + unicsv_lineno = 0; if (opt_fields) { - QString fields = QString(opt_fields).replace("+", ","); + QString fields = QString(opt_fields).replace('+', ','); unicsv_fondle_header(fields); - } else if (buff = fin->readLine(), !buff.isNull()) { + } else if (buff = fin->readLine(); !buff.isNull()) { + ++unicsv_lineno; unicsv_fondle_header(buff); } else { unicsv_fieldsep = nullptr; @@ -506,7 +522,7 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) wpt->longitude = kUnicsvUnknown; int column = -1; - const QStringList values = csv_linesplit(ibuf, unicsv_fieldsep, "\"", 0, CsvQuoteMethod::rfc4180); + const QStringList values = csv_linesplit(ibuf, unicsv_fieldsep, kUnicsvQuoteChar, unicsv_lineno, CsvQuoteMethod::rfc4180); for (auto value : values) { if (++column >= unicsv_fields_tab.size()) { break; /* ignore extra fields on line */ @@ -590,7 +606,7 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) &wpt->latitude, &wpt->longitude, MYNAME); /* coordinates from parse_coordinates are in WGS84 don't convert a second time */ - src_datum = kDautmWGS84; + src_datum = kDatumWGS84; break; case fld_bng: @@ -598,7 +614,7 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) &wpt->latitude, &wpt->longitude, MYNAME); /* coordinates from parse_coordinates are in WGS84 don't convert a second time */ - src_datum = kDautmWGS84; + src_datum = kDatumWGS84; break; case fld_bng_zone: @@ -614,11 +630,11 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) break; case fld_swiss: - parse_coordinates(value, kDautmWGS84, grid_swiss, + parse_coordinates(value, kDatumWGS84, grid_swiss, &wpt->latitude, &wpt->longitude, MYNAME); /* coordinates from parse_coordinates are in WGS84 don't convert a second time */ - src_datum = kDautmWGS84; + src_datum = kDatumWGS84; break; case fld_swiss_easting: @@ -824,7 +840,7 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) case fld_garmin_facility: gmsd = garmin_fs_t::find(wpt); if (! gmsd) { - gmsd = garmin_fs_alloc(-1); + gmsd = new garmin_fs_t(-1); wpt->fs.FsChainAdd(gmsd); } switch (unicsv_fields_tab[column]) { @@ -869,7 +885,6 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) case fld_gc_diff: case fld_gc_is_archived: case fld_gc_is_available: - case fld_gc_exported: case fld_gc_last_found: case fld_gc_placer: case fld_gc_placer_id: @@ -907,14 +922,6 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) case fld_gc_is_available: gc_data->is_available = unicsv_parse_status(value); break; - case fld_gc_exported: { - QTime etime; - QDate edate; - etime = unicsv_parse_time(value, edate); - if (edate.isValid() || etime.isValid()) { - gc_data->exported = unicsv_adjust_time(edate, etime, true); - } - } break; case fld_gc_last_found: { QTime ftime; @@ -1010,27 +1017,27 @@ UnicsvFormat::unicsv_parse_one_line(const QString& ibuf) fatal(MYNAME ": Unable to convert BNG coordinates (%.f %.f)!\n", bng_easting, bng_northing); } - if (! GPS_Math_UKOSMap_To_WGS84_M( + if (! GPS_Math_UKOSMap_To_WGS84_H( bngz, bnge, bngn, &wpt->latitude, &wpt->longitude)) fatal(MYNAME ": Unable to convert BNG coordinates (%s %.f %.f)!\n", bngz, bnge, bngn); } else { // traditional zone easting northing - if (! GPS_Math_UKOSMap_To_WGS84_M( + if (! GPS_Math_UKOSMap_To_WGS84_H( CSTR(bng_zone), bng_easting, bng_northing, &wpt->latitude, &wpt->longitude)) fatal(MYNAME ": Unable to convert BNG coordinates (%s %.f %.f)!\n", CSTR(bng_zone), bng_easting, bng_northing); } - src_datum = kDautmWGS84; /* don't convert afterwards */ + src_datum = kDatumWGS84; /* don't convert afterwards */ } else if ((swiss_easting != kUnicsvUnknown) && (swiss_northing != kUnicsvUnknown)) { GPS_Math_Swiss_EN_To_WGS84(swiss_easting, swiss_northing, &wpt->latitude, &wpt->longitude); - src_datum = kDautmWGS84; /* don't convert afterwards */ + src_datum = kDatumWGS84; /* don't convert afterwards */ } } - if ((src_datum != kDautmWGS84) && + if ((src_datum != kDatumWGS84) && (wpt->latitude != kUnicsvUnknown) && (wpt->longitude != kUnicsvUnknown)) { double alt; GPS_Math_Known_Datum_To_WGS84_M(wpt->latitude, wpt->longitude, 0.0, @@ -1067,6 +1074,7 @@ UnicsvFormat::read() } while ((buff = fin->readLine(), !buff.isNull())) { + ++unicsv_lineno; buff = buff.trimmed(); if (buff.isEmpty() || buff.startsWith('#')) { continue; @@ -1077,8 +1085,7 @@ UnicsvFormat::read() /* =========================================================================== */ -void -UnicsvFormat::unicsv_fatal_outside(const Waypoint* wpt) const +[[noreturn]] void UnicsvFormat::unicsv_fatal_outside(const Waypoint* wpt) const { *fout << "#####\n"; fatal(MYNAME ": %s (%s) is outside of convertible area of grid \"%s\"!\n", @@ -1098,8 +1105,8 @@ UnicsvFormat::unicsv_print_str(const QString& s) const // slavish re-implementation of (what I think) the original C code // was doing. t.replace("\r\n", ","); - t.replace("\r", ","); - t.replace("\n", ","); + t.replace('\r', ','); + t.replace('\n', ','); } *fout << t.trimmed(); } @@ -1124,7 +1131,7 @@ void UnicsvFormat::unicsv_waypt_enum_cb(const Waypoint* wpt) { const QString& shortname = wpt->shortname; - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); if (!shortname.isEmpty()) { unicsv_outp_flags[fld_shortname] = true; @@ -1252,9 +1259,6 @@ UnicsvFormat::unicsv_waypt_enum_cb(const Waypoint* wpt) if (gc_data->is_available != Geocache::status_t::gs_unknown) { unicsv_outp_flags[fld_gc_is_available] = true; } - if (gc_data->exported.isValid()) { - unicsv_outp_flags[fld_gc_exported] = true; - } if (gc_data->last_found.isValid()) { unicsv_outp_flags[fld_gc_last_found] = true; } @@ -1273,14 +1277,16 @@ UnicsvFormat::unicsv_waypt_enum_cb(const Waypoint* wpt) void UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) { - double lat, lon, alt; + double lat; + double lon; + double alt; const Geocache* gc_data = nullptr; unicsv_waypt_ct++; QString shortname = wpt->shortname; - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); - if (unicsv_datum_idx == kDautmWGS84) { + if (unicsv_datum_idx == kDatumWGS84) { lat = wpt->latitude; lon = wpt->longitude; alt = wpt->altitude; @@ -1313,9 +1319,10 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) case grid_bng: { char map[3]; - double north, east; + double north; + double east; - if (! GPS_Math_WGS84_To_UKOSMap_M(wpt->latitude, wpt->longitude, &east, &north, map)) { + if (! GPS_Math_WGS84_To_UKOSMap_H(wpt->latitude, wpt->longitude, &east, &north, map)) { unicsv_fatal_outside(wpt); } auto fieldWidth = fout->fieldWidth(); @@ -1328,7 +1335,8 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) case grid_utm: { int zone; char zonec; - double north, east; + double north; + double east; if (! GPS_Math_Known_Datum_To_UTM_EN(lat, lon, &east, &north, &zone, &zonec, unicsv_datum_idx)) { @@ -1341,7 +1349,8 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) break; } case grid_swiss: { - double north, east; + double north; + double east; if (! GPS_Math_WGS84_To_Swiss_EN(wpt->latitude, wpt->longitude, &east, &north)) { unicsv_fatal_outside(wpt); @@ -1534,7 +1543,7 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) if (!wpt->HasUrlLink()) { unicsv_print_str(""); } else { - UrlLink l = wpt->GetUrlLink(); + const UrlLink& l = wpt->GetUrlLink(); unicsv_print_str(l.url_); } } @@ -1622,13 +1631,6 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) *fout << unicsv_fieldsep; } } - if (unicsv_outp_flags[fld_gc_exported]) { - if (gc_data) { - unicsv_print_date_time(gc_data->exported); - } else { - *fout << unicsv_fieldsep; - } - } if (unicsv_outp_flags[fld_gc_last_found]) { if (gc_data) { unicsv_print_date_time(gc_data->last_found); @@ -1682,7 +1684,7 @@ UnicsvFormat::wr_init(const QString& fname) unicsv_outp_flags.reset(); unicsv_grid_idx = grid_unknown; - unicsv_datum_idx = kDautmWGS84; + unicsv_datum_idx = kDatumWGS84; unicsv_fieldsep = kUnicsvFieldSep; unicsv_waypt_ct = 0; @@ -1707,7 +1709,7 @@ UnicsvFormat::wr_init(const QString& fname) } else if (unicsv_grid_idx == grid_swiss) /* ! ignore parameter "Datum" ! */ { - unicsv_datum_idx = kDautmWGS84; /* internal, becomes CH1903 */ + unicsv_datum_idx = kDatumWGS84; /* internal, becomes CH1903 */ } else { unicsv_datum_idx = gt_lookup_datum_index(opt_datum, MYNAME); } @@ -1901,9 +1903,6 @@ UnicsvFormat::write() if (unicsv_outp_flags[fld_gc_is_available]) { *fout << unicsv_fieldsep << "Available"; } - if (unicsv_outp_flags[fld_gc_exported]) { - *fout << unicsv_fieldsep << "Exported"; - } if (unicsv_outp_flags[fld_gc_last_found]) { *fout << unicsv_fieldsep << "Last Found"; } diff --git a/unicsv.h b/unicsv.h index ce564508d..4bc77cb6c 100644 --- a/unicsv.h +++ b/unicsv.h @@ -133,7 +133,6 @@ class UnicsvFormat : public Format fld_gc_diff, fld_gc_is_archived, fld_gc_is_available, - fld_gc_exported, fld_gc_last_found, fld_gc_placer, fld_gc_placer_id, @@ -149,7 +148,7 @@ class UnicsvFormat : public Format /* Constants */ - /* "UNICSV_FIELD_SEP" and "UNICSV_LINE_SEP" are only used by the writer */ + /* "kUnicsvFieldSep" and "kUnicsvLineSep" are only used by the writer */ static constexpr const char* kUnicsvFieldSep = ","; static constexpr const char* kUnicsvLineSep = "\r\n"; @@ -170,11 +169,11 @@ class UnicsvFormat : public Format static QTime unicsv_parse_time(const char* str, QDate& date); static QTime unicsv_parse_time(const QString& str, QDate& date); static Geocache::status_t unicsv_parse_status(const QString& str); - QDateTime unicsv_adjust_time(const QDate date, const QTime time, bool is_localtime) const; + QDateTime unicsv_adjust_time(QDate date, QTime time, bool is_localtime) const; static bool unicsv_compare_fields(const QString& s, const field_t* f); void unicsv_fondle_header(QString header); void unicsv_parse_one_line(const QString& ibuf); - void unicsv_fatal_outside(const Waypoint* wpt) const; + [[noreturn]] void unicsv_fatal_outside(const Waypoint* wpt) const; void unicsv_print_str(const QString& s) const; void unicsv_print_date_time(const QDateTime& idt) const; void unicsv_waypt_enum_cb(const Waypoint* wpt); @@ -190,6 +189,7 @@ class UnicsvFormat : public Format double unicsv_depthscale{}; double unicsv_proximityscale{}; const char* unicsv_fieldsep{nullptr}; + int unicsv_lineno{0}; gpsbabel::TextStream* fin{nullptr}; gpsbabel::TextStream* fout{nullptr}; gpsdata_type unicsv_data_type{unknown_gpsdata}; diff --git a/util.cc b/util.cc index 0e4d848f4..7840d5268 100644 --- a/util.cc +++ b/util.cc @@ -20,13 +20,14 @@ */ #include // for sort -#include // for isspace, isalpha, ispunct, tolower, toupper +#include // for isspace, tolower #include // for errno #include // for INT_MAX, INT_MIN #include // for fabs, floor #include // for size_t, vsnprintf, FILE, fopen, printf, sprintf, stderr, stdin, stdout #include // for abs, calloc, free, malloc, realloc #include // for strlen, strcat, strstr, memcpy, strcmp, strcpy, strdup, strchr, strerror +#include // for as_const #include // for QByteArray #include // for QChar, operator<=, operator>= @@ -41,7 +42,7 @@ #include // for CaseInsensitive #include // for QTime #include // for QTimeZone -#include // for qAsConst, qEnvironmentVariableIsSet, QAddConst<>::Type, qPrintable +#include // for qEnvironmentVariableIsSet, QAddConst<>::Type, qPrintable #include "defs.h" #include "src/core/datetime.h" // for DateTime @@ -103,27 +104,6 @@ char* xstrdup(const QString& s) return xstrdup(CSTR(s)); } -/* - * Duplicate at most sz bytes in str. - */ -char* -xstrndup(const char* str, size_t sz) -{ - size_t newlen = 0; - const char* cin = str; - - while ((newlen < sz) && (*cin != '\0')) { - newlen++; - cin++; - } - - char* newstr = (char*) xmalloc(newlen + 1); - memcpy(newstr, str, newlen); - newstr[newlen] = 0; - - return newstr; -} - void* xrealloc(void* p, size_t s) { @@ -345,13 +325,9 @@ make_datetime(QDate date, QTime time, bool is_localtime, bool force_utc, int utc result = QDateTime(QDate(1970, 1, 1), time, timespec, offset); } else if (date.isValid()) { // no time, use start of day in the given Qt::TimeSpec. -#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) - result = QDateTime(date, QTime(0,0), timespec, offset); -#else result = date.startOfDay(timespec, offset); -#endif } - + return result; } @@ -573,66 +549,60 @@ rot13(const QString& s) */ QString -convert_human_date_format(const char* human_datef) +convert_human_date_format(const QString& human_datef) { - char* result = (char*) xcalloc((2*strlen(human_datef)) + 1, 1); - char* cout = result; - char prev = '\0'; + QString result; + QChar prev = '\0'; int ylen = 0; - for (const char* cin = human_datef; *cin; cin++) { - char okay = 1; + for (const QChar cin : human_datef) { + bool okay = true; - if (toupper(*cin) != 'Y') { + if (cin.toUpper() != 'Y') { ylen = 0; } - if (isalpha(*cin)) { - switch (*cin) { + if (cin.isLetter()) { + switch (cin.unicode()) { case 'y': case 'Y': if (prev != 'Y') { - strcat(cout, "%y"); - cout += 2; + result.append("%y"); prev = 'Y'; } ylen++; if (ylen > 2) { - *(cout-1) = 'Y'; + result.back() = 'Y'; } break; case 'm': case 'M': if (prev != 'M') { - strcat(cout, "%m"); - cout += 2; + result.append("%m"); prev = 'M'; } break; case 'd': case 'D': if (prev != 'D') { - strcat(cout, "%d"); - cout += 2; + result.append("%d"); prev = 'D'; } break; default: - okay = 0; + okay = false; } - } else if (ispunct(*cin)) { - *cout++ = *cin; + } else if (cin.isPunct()) { + result.append(cin); prev = '\0'; } else { - okay = 0; + okay = false; } - if (okay == 0) { - fatal("Invalid character \"%c\" in date format!", *cin); + if (!okay) { + fatal(FatalMsg().nospace() << "Invalid character " << cin << " in date format " << human_datef << "!"); } } - QString rv(result); - xfree(result); - return rv; + return result; } /* @@ -641,22 +611,20 @@ convert_human_date_format(const char* human_datef) */ QString -convert_human_time_format(const char* human_timef) +convert_human_time_format(const QString& human_timef) { - char* result = (char*) xcalloc((2*strlen(human_timef)) + 1, 1); - char* cout = result; - char prev = '\0'; + QString result; + QChar prev = '\0'; - for (const char* cin = human_timef; *cin; cin++) { - int okay = 1; + for (const QChar cin : human_timef) { + bool okay = true; - if (isalpha(*cin)) { - switch (*cin) { + if (cin.isLetter()) { + switch (cin.unicode()) { case 'S': case 's': if (prev != 'S') { - strcat(cout, "%S"); - cout += 2; + result.append("%S"); prev = 'S'; } break; @@ -664,69 +632,62 @@ convert_human_time_format(const char* human_timef) case 'M': case 'm': if (prev != 'M') { - strcat(cout, "%M"); - cout += 2; + result.append("%M"); prev = 'M'; } break; case 'h': /* 12-hour-clock */ if (prev != 'H') { - strcat(cout, "%l"); /* 1 .. 12 */ - cout += 2; + result.append("%l"); /* 1 .. 12 */ prev = 'H'; } else { - *(cout-1) = 'I'; /* 01 .. 12 */ + result.back() = 'I'; /* 01 .. 12 */ } break; case 'H': /* 24-hour-clock */ if (prev != 'H') { - strcat(cout, "%k"); - cout += 2; + result.append("%k"); prev = 'H'; } else { - *(cout-1) = 'H'; + result.back() = 'H'; } break; case 'x': if (prev != 'X') { - strcat(cout, "%P"); - cout += 2; + result.append("%P"); prev = 'X'; } else { - *(cout-1) = 'P'; + result.back() = 'P'; } break; case 'X': if (prev != 'X') { - strcat(cout, "%p"); - cout += 2; + result.append("%p"); prev = 'X'; } else { - *(cout-1) = 'p'; + result.back() = 'p'; } break; default: - okay = 0; + okay = false; } - } else if (ispunct(*cin) || isspace(*cin)) { - *cout++ = *cin; + } else if (cin.isPunct() || cin.isSpace()) { + result.append(cin); prev = '\0'; } else { - okay = 0; + okay = false; } - if (okay == 0) { - fatal("Invalid character \"%c\" in time format!", *cin); + if (!okay) { + fatal(FatalMsg().nospace() << "Invalid character " << cin << " in time format " << human_timef << "!"); } } - QString rv(result); - xfree(result); - return rv; + return result; } @@ -961,33 +922,6 @@ QString get_filename(const QString& fname) return QFileInfo(fname).fileName(); } -/* - * gb_int2ptr: Needed, when sizeof(*void) != sizeof(int) ! compiler warning ! - */ -void* gb_int2ptr(const int i) -{ - union { - void* p; - int i; - } x = { nullptr }; - - x.i = i; - return x.p; -} - -/* - * gb_ptr2int: Needed, when sizeof(*void) != sizeof(int) ! compiler warning ! - */ -int gb_ptr2int(const void* p) -{ - union { - const void* p; - int i; - } x = { p }; - - return x.i; -} - QTextCodec* get_codec(const QByteArray& cs_name) { QTextCodec* codec = QTextCodec::codecForName(cs_name); @@ -1037,7 +971,7 @@ void list_timezones() }; std::sort(zoneids.begin(), zoneids.end(), alpha); Warning() << "Available timezones are:"; - for (const auto& id : qAsConst(zoneids)) { + for (const auto& id : std::as_const(zoneids)) { Warning() << id; } } @@ -1066,7 +1000,7 @@ QString grapheme_truncate(const QString& input, unsigned int count) int xstrtoi(const char* str, char** str_end, int base) { - + long value = strtol(str, str_end, base); if (value > INT_MAX) { errno = ERANGE; diff --git a/v900.cc b/v900.cc index e11129041..4b8fb942e 100644 --- a/v900.cc +++ b/v900.cc @@ -71,77 +71,25 @@ for a little more info, see structures: one_line_advanced_mode, one_line_basic_mode, one_line_common_start. ******************************************************************************/ -#include "defs.h" -#include -#include -#include // strtod +#include "v900.h" -/* the start of each record (line) is common to both advanced and basic mode. - it will be parsed by a single common code. hence, it will be easier and clearer - to have a common structure for it. - */ -struct one_line_common_start { - char index[6]; /* record number */ - char comma1; /* ',' */ - char tag; /* tag type. T=trackpoint. TODO: more options??? */ - char comma2; /* ',' */ - char date[6]; /* YYMMDD. YY=09 is 2009. */ - char comma3; /* ',' */ - char time[6]; /* HHMMSS */ - char comma4; /* ',' */ - char latitude_num[9]; /* example: "31.768380" */ - char latitude_NS; /* 'N' or 'S' */ - char comma5; /* ',' */ - char longitude_num[10]; /* example: "035.209656" */ - char longitude_EW; /* 'E' or 'W' */ - char comma6; /* ',' */ - char height[5]; /* Altitude in meters. - * (not corrected to WGS84 ??) */ - char comma7; /* ',' */ - char speed[4]; /* speed in km/h. no decimal point. */ - char comma8; /* ',' */ - char heading[3]; /* heading in degrees */ - char comma9; /* ',' */ -}; - -/* this structure holds one record (line) in advanced logging mode. - advanced mode lines looks like this ('*' means NULL): -1717**,T,090204,062634,31.765528N,035.207730E,772**,0***,0**,2D,SPS ,2.1**,1.9**,1.0**,********* -*/ -struct one_line_advanced_mode { - struct one_line_common_start common; - char fixmode[2]; /* "2D" or "3D" */ - char comma10; /* ',' */ - char valid[4]; /* "SPS " or "DGPS" */ - char comma11; /* ',' */ - char pdop[5]; - char comma12; /* ',' */ - char hdop[5]; - char comma13; /* ',' */ - char vdop[5]; - char comma14; /* ',' */ - char vox[9]; /* voicetag recorded */ - char cr; /* '\r' */ - char lf; /* '\n' */ -}; - -/* this structure holds one record (line) in basic logging mode. - basic mode lines looks like this ('*' means NULL): -1*****,T,090404,063401,31.765931N,035.206969E,821**,0***,0**,********* -*/ -struct one_line_basic_mode { - struct one_line_common_start common; - char vox[9]; /* voicetag recorded */ - char cr; /* '\r' */ - char lf; /* '\n' */ -}; +#include // for assert +#include // for va_end, va_start +#include // for fclose, fgets, fread, vfprintf, stderr, va_list +#include // for strtod +#include // for strncmp, strcat, strcpy, strstr +#include // for QByteArray +#include // for QDate +#include // for QTime +#include // for qPrintable, UTC + +#include "defs.h" -static FILE* fin = nullptr; /* copied from dg-100.cpp */ -[[gnu::format(printf, 1, 2)]] static void -v900_log(const char* fmt, ...) +void +V900Format::v900_log(const char* fmt, ...) { va_list ap; @@ -154,8 +102,8 @@ v900_log(const char* fmt, ...) va_end(ap); } -static void -v900_rd_init(const QString& fname) +void +V900Format::rd_init(const QString& fname) { v900_log("%s(%s)\n",__func__,qPrintable(fname)); /* note: file is opened in binary mode, since lines end with \r\n, and in windows text mode @@ -168,8 +116,8 @@ v900_rd_init(const QString& fname) } } -static void -v900_rd_deinit() +void +V900Format::rd_deinit() { v900_log("%s\n",__func__); if (fin) { @@ -178,8 +126,8 @@ v900_rd_deinit() } /* copied from dg-100.c - slight (incompatible) modification to how the date parameter is used */ -static QDateTime -bintime2utc(int date, int time) { +QDateTime +V900Format::bintime2utc(int date, int time) { int secs = time % 100; time /= 100; int mins = time % 100; @@ -198,13 +146,13 @@ bintime2utc(int date, int time) { return QDateTime(dt, tm, Qt::UTC); } -static void -v900_read() +void +V900Format::read() { /* use line buffer large enough to hold either basic or advanced mode lines. */ union { - struct one_line_basic_mode bas; - struct one_line_advanced_mode adv; + one_line_basic_mode bas; + one_line_advanced_mode adv; char text[200]; /* used to read the header line, which is normal text */ } line; int lc = 0; @@ -361,19 +309,3 @@ v900_read() } } } - -/* Could be US-ASCII, since we only read "0-9,A-Z\n\r" */ - -ff_vecs_t v900_vecs = { - ff_type_file, - {ff_cap_read, ff_cap_read, ff_cap_none}, /* Read only format. May only read trackpoints and waypoints. */ - v900_rd_init, - nullptr, /* wr_init */ - v900_rd_deinit, - nullptr, /* wr_deinit */ - v900_read, - nullptr, /* write */ - nullptr, - nullptr, /* args */ - {nullptr,nullptr,nullptr,nullptr,nullptr,nullptr} -}; diff --git a/v900.h b/v900.h new file mode 100644 index 000000000..5a2b578f7 --- /dev/null +++ b/v900.h @@ -0,0 +1,135 @@ +/* + Support for Columbus/Visiontac V900 csv format + This format pads fields with NULL up to a fixed per field length. + Because of that, and because xcsv does not allows a regex as a field delimiter, + a special c module is required. + + Copyright (C) 2009 Tal Benavidor + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + */ +#ifndef V900_H_INCLUDED_ +#define V900_H_INCLUDED_ + +#include // for FILE + +#include // for QDateTime +#include // for QString +#include // for QVector + +#include "defs.h" // for ff_cap, ff_cap_read, ff_cap_none, arglist_t, ff_type, ff_type_file +#include "format.h" // for Format + + +class V900Format : public Format +{ +public: + using Format::Format; + + QVector* get_args() override + { + return nullptr; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + /* Read only format. May only read trackpoints and waypoints. */ + return {ff_cap_read, ff_cap_read, ff_cap_none}; + } + + void rd_init(const QString& fname) override; + void read() override; + void rd_deinit() override; + +private: + /* Types */ + + /* the start of each record (line) is common to both advanced and basic mode. + it will be parsed by a single common code. hence, it will be easier and clearer + to have a common structure for it. + */ + struct one_line_common_start { + char index[6]; /* record number */ + char comma1; /* ',' */ + char tag; /* tag type. T=trackpoint. TODO: more options??? */ + char comma2; /* ',' */ + char date[6]; /* YYMMDD. YY=09 is 2009. */ + char comma3; /* ',' */ + char time[6]; /* HHMMSS */ + char comma4; /* ',' */ + char latitude_num[9]; /* example: "31.768380" */ + char latitude_NS; /* 'N' or 'S' */ + char comma5; /* ',' */ + char longitude_num[10]; /* example: "035.209656" */ + char longitude_EW; /* 'E' or 'W' */ + char comma6; /* ',' */ + char height[5]; /* Altitude in meters. + * (not corrected to WGS84 ??) */ + char comma7; /* ',' */ + char speed[4]; /* speed in km/h. no decimal point. */ + char comma8; /* ',' */ + char heading[3]; /* heading in degrees */ + char comma9; /* ',' */ + }; + + /* this structure holds one record (line) in advanced logging mode. + advanced mode lines looks like this ('*' means NULL): + 1717**,T,090204,062634,31.765528N,035.207730E,772**,0***,0**,2D,SPS ,2.1**,1.9**,1.0**,********* + */ + struct one_line_advanced_mode { + one_line_common_start common; + char fixmode[2]; /* "2D" or "3D" */ + char comma10; /* ',' */ + char valid[4]; /* "SPS " or "DGPS" */ + char comma11; /* ',' */ + char pdop[5]; + char comma12; /* ',' */ + char hdop[5]; + char comma13; /* ',' */ + char vdop[5]; + char comma14; /* ',' */ + char vox[9]; /* voicetag recorded */ + char cr; /* '\r' */ + char lf; /* '\n' */ + }; + + /* this structure holds one record (line) in basic logging mode. + basic mode lines looks like this ('*' means NULL): + 1*****,T,090404,063401,31.765931N,035.206969E,821**,0***,0**,********* + */ + struct one_line_basic_mode { + one_line_common_start common; + char vox[9]; /* voicetag recorded */ + char cr; /* '\r' */ + char lf; /* '\n' */ + }; + + /* Member Functions */ + + [[gnu::format(printf, 1, 2)]] static void v900_log(const char* fmt, ...); + static QDateTime bintime2utc(int date, int time); + + /* Data Members */ + + FILE* fin = nullptr; +}; + +#endif // V900_H_INCLUDED_ diff --git a/validate.cc b/validate.cc index 50d4b0ef3..9c54f34ca 100644 --- a/validate.cc +++ b/validate.cc @@ -27,26 +27,31 @@ #if FILTERS_ENABLED #define MYNAME "validate" -void ValidateFilter::validate_head(const route_head*) +void ValidateFilter::validate_head(const route_head* /*unused*/) { head_ct += 1; - segment_ct_start = point_ct; + point_ct = 0; + segment_ct = 0; } void ValidateFilter::validate_head_trl(const route_head* header) { - int segment_waypt_ct = point_ct - segment_ct_start; + total_point_ct += point_ct; + total_segment_ct += segment_ct; if (debug) { - fprintf(stderr, "%s %d ct: %d, waypt_count: %d\n", segment_type, header->rte_num, segment_waypt_ct, header->rte_waypt_ct()); + fprintf(stderr, "%s %d ct: %d, waypt_count: %d, segments %d\n", segment_type, header->rte_num, point_ct, header->rte_waypt_ct(), segment_ct); } - if (!debug && (segment_waypt_ct != header->rte_waypt_ct())) { - fatal(MYNAME ":%s %d count mismatch, expected %d, actual %d\n", segment_type, header->rte_num, header->rte_waypt_ct(), segment_waypt_ct); + if (!debug && (point_ct != header->rte_waypt_ct())) { + fatal(MYNAME ":%s %d count mismatch, expected %d, actual %d\n", segment_type, header->rte_num, header->rte_waypt_ct(), point_ct); } } -void ValidateFilter::validate_point(const Waypoint*) +void ValidateFilter::validate_point(const Waypoint* wpt) { point_ct += 1; + if (wpt->wpt_flags.new_trkseg) { + segment_ct += 1; + } } void ValidateFilter::process() @@ -64,46 +69,48 @@ void ValidateFilter::process() } waypt_disp_all(validate_point_f); if (debug) { - fprintf(stderr, "point ct: %u, waypt_count: %u\n", point_ct, waypt_count()); + fprintf(stderr, "point ct: %d, waypt_count: %d\n", point_ct, waypt_count()); } if (!debug && (point_ct != waypt_count())) { - fatal(MYNAME ":Waypoint count mismatch, expected %u, actual %u\n", waypt_count(), point_ct); + fatal(MYNAME ":Waypoint count mismatch, expected %d, actual %d\n", waypt_count(), point_ct); } head_ct = 0; - point_ct = 0; + total_point_ct = 0; + total_segment_ct = 0; segment_type = "route"; if (debug) { fprintf(stderr, "\nProcessing routes\n"); } route_disp_all(validate_head_f, validate_head_trl_f, validate_point_f); if (debug) { - fprintf(stderr, "route head ct: %u, route_count: %u\n", head_ct, route_count()); - fprintf(stderr, "total route point ct: %u, route_waypt_count: %u\n", point_ct, route_waypt_count()); + fprintf(stderr, "route head ct: %d, route_count: %d, total segment count: %d\n", head_ct, route_count(), total_segment_ct); + fprintf(stderr, "total route point ct: %d, route_waypt_count: %d\n", total_point_ct, route_waypt_count()); } if (!debug && (head_ct != route_count())) { - fatal(MYNAME ":Route count mismatch, expected %u, actual %u\n", route_count(), head_ct); + fatal(MYNAME ":Route count mismatch, expected %d, actual %d\n", route_count(), head_ct); } - if (!debug && (point_ct != route_waypt_count())) { - fatal(MYNAME ":Total route waypoint count mismatch, expected %u, actual %u\n", route_waypt_count(), point_ct); + if (!debug && (total_point_ct != route_waypt_count())) { + fatal(MYNAME ":Total route waypoint count mismatch, expected %d, actual %d\n", route_waypt_count(), total_point_ct); } head_ct = 0; - point_ct = 0; + total_point_ct = 0; + total_segment_ct = 0; segment_type = "track"; if (debug) { fprintf(stderr, "\nProcessing tracks\n"); } track_disp_all(validate_head_f, validate_head_trl_f, validate_point_f); if (debug) { - fprintf(stderr, "track head ct: %u, track_count: %u\n", head_ct, track_count()); - fprintf(stderr, "total track point ct: %u, track_waypt_count: %u\n", point_ct, track_waypt_count()); + fprintf(stderr, "track head ct: %d, track_count: %d, total segment count: %d\n", head_ct, track_count(), total_segment_ct); + fprintf(stderr, "total track point ct: %d, track_waypt_count: %d\n", total_point_ct, track_waypt_count()); } if (!debug && (head_ct != track_count())) { - fatal(MYNAME ":Track count mismatch, expected %u, actual %u\n", track_count(), head_ct); + fatal(MYNAME ":Track count mismatch, expected %d, actual %d\n", track_count(), head_ct); } - if (!debug && (point_ct != track_waypt_count())) { - fatal(MYNAME ":Total track waypoint count mismatch, expected %u, actual %u\n", track_waypt_count(), point_ct); + if (!debug && (total_point_ct != track_waypt_count())) { + fatal(MYNAME ":Total track waypoint count mismatch, expected %d, actual %d\n", track_waypt_count(), total_point_ct); } if (checkempty) { diff --git a/validate.h b/validate.h index ad47720fb..8c81c8587 100644 --- a/validate.h +++ b/validate.h @@ -44,9 +44,11 @@ class ValidateFilter:public Filter bool debug{}; char* opt_checkempty{}; bool checkempty{}; - unsigned int point_ct{}; - unsigned int head_ct{}; - unsigned int segment_ct_start{}; + int point_ct{}; + int total_point_ct{}; + int segment_ct{}; + int total_segment_ct{}; + int head_ct{}; const char* segment_type{}; QVector args = { { @@ -59,9 +61,9 @@ class ValidateFilter:public Filter }, }; - void validate_head(const route_head*); + void validate_head(const route_head* /*unused*/); void validate_head_trl(const route_head* header); - void validate_point(const Waypoint*); + void validate_point(const Waypoint* /*unused*/); }; diff --git a/vcf.cc b/vcf.cc index ee48acbdf..491095504 100644 --- a/vcf.cc +++ b/vcf.cc @@ -18,53 +18,40 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "vcf.h" + #include // for fabs #include // for abs #include // for QString -#include // for QVector #include // for CaseInsensitive #include "defs.h" -#include "gbfile.h" // for gbfprintf, gbfputs, gbfclose, gbfopen, gbfile +#include "gbfile.h" // for gbfprintf, gbfputs, gbfclose, gbfopen #include "geocache.h" // for Geocache, Geocache::UtfString -static gbfile* file_out; -static short_handle mkshort_handle; - -static char* vcf_encrypt = nullptr; - #define MYNAME "VCF" -static -QVector vcf_args = { - { - "encrypt", &vcf_encrypt, - "Encrypt hints using ROT13", nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, -}; -static void -wr_init(const QString& fname) +void +VcfFormat::wr_init(const QString& fname) { file_out = gbfopen(fname, "w", MYNAME); - mkshort_handle = mkshort_new_handle(); } -static void -wr_deinit() +void +VcfFormat::wr_deinit() { gbfclose(file_out); - mkshort_del_handle(&mkshort_handle); } /* * Print a possibly empty input string, replacing newlines with escaped * newlines as we go. */ -static void -vcf_print_utf(const Geocache::UtfString* s) +void +VcfFormat::vcf_print_utf(const Geocache::UtfString* s) { if (nullptr == s) { return; @@ -80,8 +67,8 @@ vcf_print_utf(const Geocache::UtfString* s) gbfputs(stripped_html, file_out); } -static void -vcf_print(const char* s) +void +VcfFormat::vcf_print(const char* s) { if (!s) { return; @@ -93,14 +80,14 @@ vcf_print(const char* s) gbfputs(cleaned, file_out); } -static void -vcf_print(const QString& s) +void +VcfFormat::vcf_print(const QString& s) { vcf_print(CSTR(s)); } -static void -vcf_disp(const Waypoint* wpt) +void +VcfFormat::vcf_disp(const Waypoint* wpt) { int lonint = abs((int) wpt->longitude); int latint = abs((int) wpt->latitude); @@ -110,7 +97,7 @@ vcf_disp(const Waypoint* wpt) gbfprintf(file_out, "ADR:%c%d %06.3f %c%d %06.3f\n", wpt->latitude < 0 ? 'S' : 'N', abs(latint), 60.0 * (fabs(wpt->latitude) - latint), wpt->longitude < 0 ? 'W' : 'E', abs(lonint), 60.0 * (fabs(wpt->longitude) - lonint)); if (wpt->HasUrlLink()) { - UrlLink link = wpt->GetUrlLink(); + const UrlLink& link = wpt->GetUrlLink(); gbfprintf(file_out, "URL:%s\n", CSTR(link.url_)); } @@ -118,7 +105,7 @@ vcf_disp(const Waypoint* wpt) vcf_print_utf(&wpt->gc_data->desc_short); gbfprintf(file_out, "\\n"); vcf_print_utf(&wpt->gc_data->desc_long); - gbfprintf(file_out, "\\n\\nHINT:\\n"); + gbfprintf(file_out, R"(\n\nHINT:\n)"); if (vcf_encrypt) { QString s = rot13(wpt->gc_data->hint); vcf_print(s); @@ -129,24 +116,10 @@ vcf_disp(const Waypoint* wpt) gbfprintf(file_out, "\nEND:VCARD\n"); } -static void -data_write() +void VcfFormat::write() { - setshort_length(mkshort_handle, 6); - waypt_disp_all(vcf_disp); + auto vcf_disp_lambda = [this](const Waypoint* waypointp)->void { + vcf_disp(waypointp); + }; + waypt_disp_all(vcf_disp_lambda); } - - -ff_vecs_t vcf_vecs = { - ff_type_file, - { ff_cap_write, ff_cap_none, ff_cap_none}, - nullptr, - wr_init, - nullptr, - wr_deinit, - nullptr, - data_write, - nullptr, - &vcf_args, - NULL_POS_OPS -}; diff --git a/vcf.h b/vcf.h new file mode 100644 index 000000000..7a4a53131 --- /dev/null +++ b/vcf.h @@ -0,0 +1,79 @@ +/* + Output only format for Vcard format, VCF + + Copyright (C) 2005 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ +#ifndef VCF_H_INCLUDED_ +#define VCF_H_INCLUDED_ + +#include // for QString +#include // for QVector + +#include "defs.h" +#include "format.h" // for Format +#include "gbfile.h" // for gbfile +#include "geocache.h" // for Geocache + + +class VcfFormat : public Format +{ +public: + using Format::Format; + + QVector* get_args() override + { + return &vcf_args; + } + + ff_type get_type() const override + { + return ff_type_file; + } + + QVector get_cap() const override + { + return {ff_cap_write, ff_cap_none, ff_cap_none}; + } + + void wr_init(const QString& fname) override; + void write() override; + void wr_deinit() override; + +private: + + /* Member Functions */ + + void vcf_print_utf(const Geocache::UtfString* s); + void vcf_print(const char* s); + void vcf_print(const QString& s); + void vcf_disp(const Waypoint* wpt); + + /* Data Members */ + + gbfile* file_out{}; + + char* vcf_encrypt = nullptr; + + QVector vcf_args = { + { + "encrypt", &vcf_encrypt, + "Encrypt hints using ROT13", nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + }; + +}; +#endif // VCF_H_INCLUDED_ diff --git a/vecs.cc b/vecs.cc index 10c5fca2f..1a232f408 100644 --- a/vecs.cc +++ b/vecs.cc @@ -31,35 +31,41 @@ #include // for QStringList #include // for QVector #include // for CaseInsensitive -#include // for qPrintable, qAsConst +#include // for qPrintable #include // for sort #include // for assert #include // for printf, putchar, sscanf -#include // for add_const<>::type, is_base_of +#include // for is_base_of +#include // for as_const #include "defs.h" // for arglist_t, ff_vecs_t, ff_cap, fatal, CSTR, ARGTYPE_TYPEMASK, case_ignore_strcmp, global_options, global_opts, warning, xfree, ARGTYPE_BOOL, ff_cap_read, ff_cap_write, ARGTYPE_HIDDEN, ff_type_internal, xstrdup, ARGTYPE_INT, ARGTYPE_REQUIRED, ARGTYPE_FLOAT #include "dg-100.h" // for Dg100FileFormat, Dg100SerialFormat, Dg200FileFormat, Dg200SerialFormat #include "exif.h" // for ExifFormat #include "format.h" // for Format +#include "garmin.h" // for GarminFormat #include "garmin_fit.h" // for GarminFitFormat #include "garmin_gpi.h" // for GarminGPIFormat +#include "garmin_txt.h" // for GarminTxtFormat +#include "garmin_xt.h" // for GarminXTFormat #include "gbversion.h" // for WEB_DOC_DIR #include "gdb.h" // for GdbFormat #include "geojson.h" // for GeoJsonFormat #include "globalsat_sport.h" // for GlobalsatSportFormat #include "geo.h" // for GeoFormat #include "gpx.h" // for GpxFormat +#include "gtm.h" // for GtmFormat #include "gtrnctr.h" // for GtrnctrFormat #include "html.h" // for HtmlFormat #include "humminbird.h" // for HumminbirdFormat, HumminbirdHTFormat #include "igc.h" // for IgcFormat #include "inifile.h" // for inifile_readstr #include "kml.h" // for KmlFormat -#include "legacyformat.h" // for LegacyFormat #include "lowranceusr.h" // for LowranceusrFormat +#include "mtk_logger.h" // for MtkFormat, MtkM241Format, MtkFileFormat, MtkM241FileFormat #include "nmea.h" // for NmeaFormat #include "osm.h" // for OsmFormat +#include "ozi.h" // for OziFormat #include "qstarz_bl_1000.h" // for QstarzBL1000Format #include "random.h" // for RandomFormat #include "shape.h" // for ShapeFormat @@ -67,35 +73,15 @@ #include "src/core/logging.h" // for Warning, FatalMsg #include "subrip.h" // for SubripFormat #include "text.h" // for TextFormat +#include "tpg.h" // for TpgFormat +#include "tpo.h" // for Tpo2Format, Tpo3Format #include "unicsv.h" // for UnicsvFormat +#include "v900.h" // for V900Format +#include "vcf.h" // for VcfFormat #include "xcsv.h" // for XcsvStyle, XcsvFormat -#include "googletakeout.h" // for GoogleTakeoutFormat +#include "googletakeout.h" // for GoogleTakeoutFormat -extern ff_vecs_t geo_vecs; -extern ff_vecs_t garmin_vecs; -extern ff_vecs_t ozi_vecs; -#if MAXIMAL_ENABLED -extern ff_vecs_t tpg_vecs; -extern ff_vecs_t tpo2_vecs; -extern ff_vecs_t tpo3_vecs; -extern ff_vecs_t gpl_vecs; -extern ff_vecs_t mtk_vecs; -extern ff_vecs_t mtk_fvecs; -extern ff_vecs_t mtk_m241_vecs; -extern ff_vecs_t mtk_m241_fvecs; -#endif // MAXIMAL_ENABLED -#if MAXIMAL_ENABLED -extern ff_vecs_t vcf_vecs; -extern ff_vecs_t gtm_vecs; -#if CSVFMTS_ENABLED -extern ff_vecs_t garmin_txt_vecs; -#endif // CSVFMTS_ENABLED -extern ff_vecs_t ggv_log_vecs; -extern ff_vecs_t v900_vecs; -extern ff_vecs_t format_garmin_xt_vecs; -#endif // MAXIMAL_ENABLED - #define MYNAME "vecs" template @@ -114,33 +100,31 @@ struct Vecs::Impl { * of this class is constructed. */ GpxFormat gpx_fmt; - LegacyFormat garmin_fmt {garmin_vecs}; + GarminFormat garmin_fmt; GdbFormat gdb_fmt; NmeaFormat nmea_fmt; - LegacyFormat ozi_fmt {ozi_vecs}; + OziFormat ozi_fmt; KmlFormat kml_fmt; #if MAXIMAL_ENABLED LowranceusrFormat lowranceusr_fmt; - LegacyFormat tpg_fmt {tpg_vecs}; - LegacyFormat tpo2_fmt {tpo2_vecs}; - LegacyFormat tpo3_fmt {tpo3_vecs}; + Tpo2Format tpo2_fmt; + Tpo3Format tpo3_fmt; #if SHAPELIB_ENABLED ShapeFormat shape_fmt; #endif TextFormat text_fmt; HtmlFormat html_fmt; IgcFormat igc_fmt; - LegacyFormat mtk_fmt {mtk_vecs}; - LegacyFormat mtk_ffmt {mtk_fvecs}; - LegacyFormat mtk_m241_fmt {mtk_m241_vecs}; - LegacyFormat mtk_m241_ffmt {mtk_m241_fvecs}; + MtkFormat mtk_fmt; + MtkFileFormat mtk_ffmt; + MtkM241Format mtk_m241_fmt; + MtkM241FileFormat mtk_m241_ffmt; #endif // MAXIMAL_ENABLED #if MAXIMAL_ENABLED - LegacyFormat vcf_fmt {vcf_vecs}; UnicsvFormat unicsv_fmt; - LegacyFormat gtm_fmt {gtm_vecs}; + GtmFormat gtm_fmt; #if CSVFMTS_ENABLED - LegacyFormat garmin_txt_fmt {garmin_txt_vecs}; + GarminTxtFormat garmin_txt_fmt; #endif // CSVFMTS_ENABLED GtrnctrFormat gtc_fmt; GarminGPIFormat garmin_gpi_fmt; @@ -153,16 +137,14 @@ struct Vecs::Impl { ExifFormat exif_fmt; HumminbirdFormat humminbird_fmt; HumminbirdHTFormat humminbird_ht_fmt; - LegacyFormat v900_fmt {v900_vecs}; SkytraqFormat skytraq_fmt; SkytraqfileFormat skytraq_ffmt; MinihomerFormat miniHomer_fmt; SubripFormat subrip_fmt; - LegacyFormat format_garmin_xt_fmt {format_garmin_xt_vecs}; + GarminXTFormat format_garmin_xt_fmt; GarminFitFormat format_fit_fmt; GeoJsonFormat geojson_fmt; GlobalsatSportFormat globalsat_sport_fmt; - QstarzBL1000Format qstarz_bl_1000_fmt; #endif // MAXIMAL_ENABLED const QVector vec_list { @@ -236,11 +218,12 @@ struct Vecs::Impl { nullptr, }, { - &tpg_fmt, + nullptr, "tpg", "National Geographic Topo .tpg (waypoints)", "tpg", nullptr, + &fmtfactory }, { &tpo2_fmt, @@ -317,11 +300,12 @@ struct Vecs::Impl { #endif // MAXIMAL_ENABLED #if MAXIMAL_ENABLED { - &vcf_fmt, + nullptr, "vcard", "Vcard Output (for iPod)", "vcf", nullptr, + &fmtfactory }, { &unicsv_fmt, @@ -424,11 +408,12 @@ struct Vecs::Impl { nullptr, }, { - &v900_fmt, + nullptr, "v900", "Columbus/Visiontac V900 files (.csv)", nullptr, nullptr, + &fmtfactory }, { &skytraq_fmt, @@ -487,11 +472,12 @@ struct Vecs::Impl { nullptr, }, { - &qstarz_bl_1000_fmt, + nullptr, "qstarz_bl-1000", "Qstarz BL-1000", nullptr, nullptr, + &fmtfactory }, { nullptr, @@ -720,7 +706,7 @@ void Vecs::disp_vec_options(const QString& vecname, const QVector* ar { if (args) { for (const auto& arg : *args) { - if (*arg.argval && arg.argval) { + if (arg.argval && *arg.argval) { printf("options: module/option=value: %s/%s=\"%s\"", qPrintable(vecname), qPrintable(arg.argstring), *arg.argval); if (case_ignore_strcmp(arg.defaultvalue, *arg.argval) == 0) { @@ -817,7 +803,7 @@ Vecs::fmtinfo_t Vecs::find_vec(const QString& fmtargstring) * Didn't find it in the table of "real" file types, so plan B * is to search the list of xcsv styles. */ - for (const auto& svec : qAsConst(style_list)) { + for (const auto& svec : std::as_const(style_list)) { if (fmtname.compare(svec.name, Qt::CaseInsensitive) != 0) { continue; } diff --git a/vecs.h b/vecs.h index e2ccf4829..415f3b402 100644 --- a/vecs.h +++ b/vecs.h @@ -44,7 +44,7 @@ class Vecs class fmtinfo_t { public: - bool isDynamic() { + bool isDynamic() const { return factory != nullptr; } explicit operator bool() const { diff --git a/waypt.cc b/waypt.cc index 30b255c73..1d476c3d7 100644 --- a/waypt.cc +++ b/waypt.cc @@ -22,6 +22,7 @@ #include // for assert #include // for fabs #include // for fflush, fprintf, stdout +#include // for as_const #include // for QChar #include // for QDateTime @@ -47,12 +48,6 @@ WaypointList* global_waypoint_list; Geocache Waypoint::empty_gc_data; -static global_trait traits; - -const global_trait* get_traits() -{ - return &traits; -} void waypt_init() @@ -60,22 +55,6 @@ waypt_init() global_waypoint_list = new WaypointList; } -void update_common_traits(const Waypoint* wpt) -{ - /* This is a bit tacky, but it allows a hint whether we've seen - * this data or not in the life cycle of this run. Of course, - * the caches could have been filtered out of existence and not - * all waypoints may have this and a few other pitfalls, but it's - * an easy and fast test here. - */ - traits.trait_geocaches |= (wpt->gc_data->diff && wpt->gc_data->terr); - traits.trait_heartrate |= wpt->heartrate > 0; - traits.trait_cadence |= wpt->cadence > 0; - traits.trait_power |= wpt->power > 0; - traits.trait_depth |= wpt->depth_has_value(); - traits.trait_temperature |= wpt->temperature_has_value(); -} - void waypt_add(Waypoint* wpt) { @@ -94,7 +73,7 @@ del_marked_wpts() global_waypoint_list->del_marked_wpts(); } -unsigned int +int waypt_count() { return global_waypoint_list->count(); @@ -221,11 +200,12 @@ waypt_add_url(Waypoint* wpt, const QString& link, const QString& url_link_text, wpt->AddUrlLink(UrlLink(link, url_link_text, url_link_type)); } +// TODO: change inputs to PositionDeg? double gcgeodist(const double lat1, const double lon1, const double lat2, const double lon2) { - return radtometers(gcdist(RAD(lat1), RAD(lon1), RAD(lat2), RAD(lon2))); + return radtometers(gcdist(PositionDeg(lat1, lon1), PositionDeg(lat2, lon2))); } /* @@ -252,22 +232,20 @@ double waypt_distance_ex(const Waypoint* A, const Waypoint* B) { double res = 0; - garmin_fs_t* gmsd; if ((A == nullptr) || (B == nullptr)) { return 0; } - if ((gmsd = garmin_fs_t::find(A)) && (gmsd->ilinks != nullptr)) { - garmin_ilink_t* link = gmsd->ilinks; - - res = gcgeodist(A->latitude, A->longitude, link->lat, link->lon); - while (link->next != nullptr) { - garmin_ilink_t* prev = link; - link = link->next; - res += gcgeodist(prev->lat, prev->lon, link->lat, link->lon); + if (const garmin_fs_t* gmsd = garmin_fs_t::find(A); (gmsd != nullptr) && (!gmsd->ilinks.isEmpty())) { + auto prev_lat = A->latitude; + auto prev_lon = A->longitude; + for (const auto& link : gmsd->ilinks) { + res += gcgeodist(prev_lat, prev_lon, link.lat, link.lon); + prev_lat = link.lat; + prev_lon = link.lon; } - res += gcgeodist(link->lat, link->lon, B->latitude, B->longitude); + res += gcgeodist(gmsd->ilinks.last().lat, gmsd->ilinks.last().lon, B->latitude, B->longitude); } else { res = gcgeodist(A->latitude, A->longitude, B->latitude, B->longitude); } @@ -378,7 +356,7 @@ double waypt_course(const Waypoint* A, const Waypoint* B) { if (A && B) { - return heading_true_degrees(RAD(A->latitude), RAD(A->longitude), RAD(B->latitude), RAD(B->longitude)); + return heading_true_degrees(A->position(), B->position()); } else { return 0; } @@ -541,12 +519,11 @@ Waypoint::CreationTimeXML() const QDateTime dt = GetCreationTime().toUTC(); - const char* format = "yyyy-MM-ddTHH:mm:ssZ"; if (dt.time().msec()) { - format = "yyyy-MM-ddTHH:mm:ss.zzzZ"; + return dt.toString(u"yyyy-MM-ddTHH:mm:ss.zzzZ"); + } else { + return dt.toString(u"yyyy-MM-ddTHH:mm:ssZ"); } - - return dt.toString(format); } gpsbabel::DateTime @@ -582,31 +559,53 @@ Waypoint::EmptyGCData() const return (gc_data == &Waypoint::empty_gc_data); } -void -WaypointList::waypt_add(Waypoint* wpt) +void Waypoint::NormalizePosition() { - double lat_orig = wpt->latitude; - double lon_orig = wpt->longitude; - append(wpt); + double lat_orig = this->latitude; + double lon_orig = this->longitude; + + if (this->latitude < -90.0 || this->latitude > 90.0) { + bool fliplon = false; + this->latitude = remainder(this->latitude, 360.0); // -180 <= this->latitude <= 180 + if (this->latitude < -90.0) { + this->latitude = -180.0 - this->latitude; + fliplon = true; + } else if (this->latitude > 90.0) { + this->latitude = 180.0 - this->latitude; + fliplon = true; + } - if (wpt->latitude < -90) { - wpt->latitude += 180; - } else if (wpt->latitude > +90) { - wpt->latitude -= 180; + if (fliplon) { + if (this->longitude < 0.0) { + this->longitude += 180.0; + } else { + this->longitude -= 180.0; + } + } } - if (wpt->longitude < -180) { - wpt->longitude += 360; - } else if (wpt->longitude > +180) { - wpt->longitude -= 360; + + if (this->longitude < -180.0 || this->longitude >= 180.0) { + this->longitude = remainder(this->longitude, 360.0); // -180 <= this->longitude <= 180 + if (this->longitude == 180.0) { + this->longitude = -180.0; + } } - if ((wpt->latitude < -90) || (wpt->latitude > 90.0)) - fatal(FatalMsg() << wpt->session->name + if ((this->latitude < -90) || (this->latitude > 90.0)) + fatal(FatalMsg() << this->session->name << "Invalid latitude" << lat_orig << "in waypoint" - << wpt->shortname); - if ((wpt->longitude < -180) || (wpt->longitude > 180.0)) + << this->shortname); + if ((this->longitude < -180) || (this->longitude > 180.0)) fatal(FatalMsg() << "Invalid longitude" << lon_orig << "in waypoint" - << wpt->shortname); + << this->shortname); +} + +void +WaypointList::waypt_add(Waypoint* wpt) +{ + append(wpt); + + wpt->NormalizePosition(); /* * Some input may not have one or more of these types so we @@ -636,10 +635,6 @@ WaypointList::waypt_add(Waypoint* wpt) } } - if (this == global_waypoint_list) { - update_common_traits(wpt); - } - } void @@ -647,6 +642,8 @@ WaypointList::add_rte_waypt(int waypt_ct, Waypoint* wpt, bool synth, QStringView { append(wpt); + wpt->NormalizePosition(); + if (synth && wpt->shortname.isEmpty()) { wpt->shortname = QStringLiteral("%1%2").arg(namepart).arg(waypt_ct, number_digits, 10, QChar('0')); wpt->wpt_flags.shortname_is_synthetic = 1; @@ -668,7 +665,7 @@ WaypointList::del_marked_wpts() WaypointList oldlist; swap(oldlist); - for (Waypoint* wpt : qAsConst(oldlist)) { + for (Waypoint* wpt : std::as_const(oldlist)) { if (wpt->wpt_flags.marked_for_deletion) { delete wpt; } else { diff --git a/xcsv.cc b/xcsv.cc index fa7e6dbdc..050f2b231 100644 --- a/xcsv.cc +++ b/xcsv.cc @@ -33,6 +33,7 @@ #include // for strlen, strncmp, strcmp #include // for gmtime, localtime, time_t, mktime, strftime #include // for optional +#include // for as_const #include // for QByteArray #include // for QChar @@ -46,15 +47,16 @@ #include // for QString, operator+, operator== #include // for QStringList #include // for QTextStream -#include // for qAsConst, qRound, qPrintable +#include // for CaseInsensitive +#include // for qRound, qPrintable #include "defs.h" #include "csv_util.h" // for csv_stringtrim, dec_to_human, csv_stringclean, human_to_dec, ddmmdir_to_degrees, dec_to_intdeg, decdir_to_dec, intdeg_to_dec, csv_linesplit #include "formspec.h" // for FormatSpecificDataList -#include "garmin_fs.h" // for garmin_fs_t, garmin_fs_alloc +#include "garmin_fs.h" // for garmin_fs_t #include "geocache.h" // for Geocache, Geocache::status_t, Geoc... #include "grtcirc.h" // for RAD, gcdist, radtometers -#include "jeeps/gpsmath.h" // for GPS_Math_WGS84_To_UTM_EN, GPS_Lookup_Datum_Index, GPS_Math_Known_Datum_To_WGS84_M, GPS_Math_UTM_EN_To_Known_Datum, GPS_Math_WGS84_To_Known_Datum_M, GPS_Math_WGS84_To_UKOSMap_M +#include "jeeps/gpsmath.h" // for GPS_Math_WGS84_To_UTM_EN, GPS_Lookup_Datum_Index, GPS_Math_Known_Datum_To_WGS84_M, GPS_Math_UTM_EN_To_Known_Datum, GPS_Math_WGS84_To_Known_Datum_M, GPS_Math_WGS84_To_UKOSMap_H #include "jeeps/gpsport.h" // for int32 #include "session.h" // for session_t #include "src/core/datetime.h" // for DateTime @@ -165,7 +167,7 @@ const QHash XcsvStyle::xcsv_char_table { { "COLON", ":" }, { "SEMICOLON", ";" }, { "NEWLINE", "\n" }, - { "CR", "\n" }, + { "CR", "\r" }, { "CRNEWLINE", "\r\n" }, { "TAB", "\t" }, { "SPACE", " " }, @@ -247,7 +249,7 @@ XcsvStyle::xcsv_ofield_add(XcsvStyle* style, const QString& qkey, const QString& QDate XcsvFormat::yyyymmdd_to_time(const QString& s) { - return QDate::fromString(s, "yyyyMMdd"); + return QDate::fromString(s, u"yyyyMMdd"); } QDateTime @@ -361,7 +363,7 @@ XcsvFormat::gmsd_init(Waypoint* wpt) { garmin_fs_t* gmsd = garmin_fs_t::find(wpt); if (gmsd == nullptr) { - gmsd = garmin_fs_alloc(-1); + gmsd = new garmin_fs_t(-1); wpt->fs.FsChainAdd(gmsd); } return gmsd; @@ -644,13 +646,8 @@ XcsvFormat::xcsv_parse_val(const QString& value, Waypoint* wpt, const XcsvStyle: } break; case XcsvStyle::XT_GEOCACHE_LAST_FOUND: { - QDate date; - date = yyyymmdd_to_time(value); -#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) - wpt->AllocGCData()->last_found = QDateTime(date); -#else + QDate date = yyyymmdd_to_time(value); wpt->AllocGCData()->last_found = date.startOfDay(); -#endif break; } @@ -854,7 +851,7 @@ XcsvFormat::read() * pre-read the file to know how many data lines we should be seeing, * we take this cheap shot at the data and cross our fingers. */ - for (const auto& ogp : qAsConst(xcsv_style->epilogue)) { + for (const auto& ogp : std::as_const(xcsv_style->epilogue)) { if (ogp.startsWith(buff)) { buff.clear(); break; @@ -910,7 +907,7 @@ XcsvFormat::read() wpt_tmp->longitude = -wpt_tmp->longitude; } - if ((xcsv_file->gps_datum_idx > -1) && (xcsv_file->gps_datum_idx != kDautmWGS84)) { + if ((xcsv_file->gps_datum_idx > -1) && (xcsv_file->gps_datum_idx != kDatumWGS84)) { double alt; GPS_Math_Known_Datum_To_WGS84_M(wpt_tmp->latitude, wpt_tmp->longitude, 0.0, &wpt_tmp->latitude, &wpt_tmp->longitude, &alt, xcsv_file->gps_datum_idx); @@ -921,7 +918,7 @@ XcsvFormat::read() &wpt_tmp->longitude, parse_data.utm_easting, parse_data.utm_northing, parse_data.utm_zone, parse_data.utm_zonec, - kDautmWGS84); + kDatumWGS84); } if (parse_data.link_) { @@ -966,8 +963,7 @@ void XcsvFormat::xcsv_resetpathlen(const route_head* head) { pathdist = 0; - oldlat = 999; - oldlon = 999; + old_position.reset(); csv_route = csv_track = nullptr; switch (xcsv_style->datatype) { case trkdata: @@ -989,17 +985,20 @@ void XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) { QString buff; - double latitude, longitude; - int32 utmz; - double utme, utmn; + double latitude; + double longitude; + int32_t utmz; + double utme; + double utmn; char utmzc; - if (oldlon < 900) { - pathdist += radtometers(gcdist(RAD(oldlat),RAD(oldlon), - RAD(wpt->latitude),RAD(wpt->longitude))); + if (old_position) { + pathdist += radtometers(gcdist(old_position.value(), + wpt->position())); } - longitude = oldlon = wpt->longitude; - latitude = oldlat = wpt->latitude; + old_position = wpt->position(); + latitude = wpt->latitude; + longitude = wpt->longitude; QString write_delimiter; if (xcsv_style->field_delimiter == u"\\w") { @@ -1013,7 +1012,7 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) if (wpt->shortname.isEmpty() || global_opts.synthesize_shortnames) { if (!wpt->description.isEmpty()) { if (global_opts.synthesize_shortnames) { - shortname = mkshort_from_wpt(xcsv_file->mkshort_handle, wpt); + shortname = xcsv_file->mkshort_handle.mkshort_from_wpt(wpt); } else { shortname = csv_stringclean(wpt->description, xcsv_style->badchars); } @@ -1037,14 +1036,14 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) description = shortname; } - if ((xcsv_file->gps_datum_idx > -1) && (xcsv_file->gps_datum_idx != kDautmWGS84)) { + if ((xcsv_file->gps_datum_idx > -1) && (xcsv_file->gps_datum_idx != kDatumWGS84)) { double alt; GPS_Math_WGS84_To_Known_Datum_M(latitude, longitude, 0.0, &latitude, &longitude, &alt, xcsv_file->gps_datum_idx); } int i = 0; - for (const auto& fmp : qAsConst(xcsv_style->ofields)) { + for (const auto& fmp : std::as_const(xcsv_style->ofields)) { double lat = latitude; double lon = longitude; /* @@ -1091,10 +1090,10 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) case XcsvStyle::XT_ANYNAME: { QString anyname = wpt->shortname; if (anyname.isEmpty()) { - anyname = mkshort(xcsv_file->mkshort_handle, wpt->description); + anyname = xcsv_file->mkshort_handle.mkshort(wpt->description); } if (anyname.isEmpty()) { - anyname = mkshort(xcsv_file->mkshort_handle, wpt->description); + anyname = xcsv_file->mkshort_handle.mkshort(wpt->description); } if (anyname.isEmpty()) { anyname = wpt->notes; @@ -1119,7 +1118,7 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) buff = xcsv_urlbase; } if (wpt->HasUrlLink()) { - UrlLink l = wpt->GetUrlLink(); + const UrlLink& l = wpt->GetUrlLink(); buff += QString::asprintf(fmp.printfc.constData(), CSTR(l.url_)); } else { buff += QString::asprintf(fmp.printfc.constData(), fmp.val.constData() && *fmp.val.constData() ? fmp.val.constData() : "\"\""); @@ -1128,7 +1127,7 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) break; case XcsvStyle::XT_URL_LINK_TEXT: if (wpt->HasUrlLink()) { - UrlLink l = wpt->GetUrlLink(); + const UrlLink& l = wpt->GetUrlLink(); buff = QString::asprintf(fmp.printfc.constData(), !l.url_link_text_.isEmpty() ? CSTR(l.url_link_text_) : fmp.val.constData()); } @@ -1226,8 +1225,9 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) /* SPECIAL COORDINATES */ case XcsvStyle::XT_MAP_EN_BNG: { char map[3]; - double north, east; - if (! GPS_Math_WGS84_To_UKOSMap_M(wpt->latitude, wpt->longitude, &east, &north, map)) + double north; + double east; + if (! GPS_Math_WGS84_To_UKOSMap_H(wpt->latitude, wpt->longitude, &east, &north, map)) fatal(MYNAME ": Position (%.5f/%.5f) outside of BNG.\n", wpt->latitude, wpt->longitude); buff = QString::asprintf(fmp.printfc.constData(), map, qRound(east), qRound(north)); @@ -1538,42 +1538,42 @@ XcsvFormat::xcsv_waypt_pr(const Waypoint* wpt) break; /* GMSD ************************************************************/ case XcsvStyle::XT_COUNTRY: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_country(gmsd, ""))); } break; case XcsvStyle::XT_STATE: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_state(gmsd, ""))); } break; case XcsvStyle::XT_CITY: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_city(gmsd, ""))); } break; case XcsvStyle::XT_POSTAL_CODE: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_postal_code(gmsd, ""))); } break; case XcsvStyle::XT_STREET_ADDR: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_addr(gmsd, ""))); } break; case XcsvStyle::XT_PHONE_NR: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_phone_nr(gmsd, ""))); } break; case XcsvStyle::XT_FACILITY: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_facility(gmsd, ""))); } break; case XcsvStyle::XT_EMAIL: { - garmin_fs_t* gmsd = garmin_fs_t::find(wpt); + const garmin_fs_t* gmsd = garmin_fs_t::find(wpt); buff = QString::asprintf(fmp.printfc.constData(), CSTR(garmin_fs_t::get_email(gmsd, ""))); } break; @@ -1663,7 +1663,7 @@ XcsvFormat::write() waypt_out_count = 0; /* output prologue lines, if any. */ - for (const auto& line : qAsConst(xcsv_style->prologue)) { + for (const auto& line : std::as_const(xcsv_style->prologue)) { QString line_to_write = xcsv_replace_tokens(line); xcsv_file->stream << line_to_write << xcsv_style->record_delimiter; } @@ -1686,7 +1686,7 @@ XcsvFormat::write() } /* output epilogue lines, if any. */ - for (const auto& line : qAsConst(xcsv_style->epilogue)) { + for (const auto& line : std::as_const(xcsv_style->epilogue)) { QString line_to_write = xcsv_replace_tokens(line); xcsv_file->stream << line_to_write << xcsv_style->record_delimiter; } @@ -1954,32 +1954,32 @@ XcsvFormat::wr_init(const QString& fname) xcsv_file->fname = fname; if (xcsv_style->shortlen) { - setshort_length(xcsv_file->mkshort_handle, *xcsv_style->shortlen); + xcsv_file->mkshort_handle.set_length(*xcsv_style->shortlen); } if (xcsv_style->whitespace_ok) { - setshort_whitespace_ok(xcsv_file->mkshort_handle, *xcsv_style->whitespace_ok); + xcsv_file->mkshort_handle.set_whitespace_ok(*xcsv_style->whitespace_ok); } /* set mkshort options from the command line */ if (global_opts.synthesize_shortnames) { if (snlenopt) { - setshort_length(xcsv_file->mkshort_handle, xstrtoi(snlenopt, nullptr, 10)); + xcsv_file->mkshort_handle.set_length(xstrtoi(snlenopt, nullptr, 10)); } if (snwhiteopt) { - setshort_whitespace_ok(xcsv_file->mkshort_handle, xstrtoi(snwhiteopt, nullptr, 10)); + xcsv_file->mkshort_handle.set_whitespace_ok(xstrtoi(snwhiteopt, nullptr, 10)); } if (snupperopt) { - setshort_mustupper(xcsv_file->mkshort_handle, xstrtoi(snupperopt, nullptr, 10)); + xcsv_file->mkshort_handle.set_mustupper(xstrtoi(snupperopt, nullptr, 10)); } if (snuniqueopt) { - setshort_mustuniq(xcsv_file->mkshort_handle, xstrtoi(snuniqueopt, nullptr, 10)); + xcsv_file->mkshort_handle.set_mustuniq(xstrtoi(snuniqueopt, nullptr, 10)); } - setshort_badchars(xcsv_file->mkshort_handle, CSTR(xcsv_style->badchars)); + xcsv_file->mkshort_handle.set_badchars(CSTR(xcsv_style->badchars)); } diff --git a/xcsv.h b/xcsv.h index 0cbfd1345..7d4349259 100644 --- a/xcsv.h +++ b/xcsv.h @@ -37,8 +37,9 @@ #include // for qRound64 #include "defs.h" -#include "format.h" -#include "garmin_fs.h" +#include "format.h" // for Format +#include "garmin_fs.h" // for garmin_fs_t +#include "mkshort.h" // for MakeShort #include "src/core/datetime.h" // for DateTime #include "src/core/textstream.h" // for TextStream @@ -239,7 +240,7 @@ class XcsvStyle std::optional shortlen; /* SHORTWHITE from style file */ - std::optional whitespace_ok; + std::optional whitespace_ok; private: /* Types */ @@ -298,28 +299,13 @@ class XcsvFormat : public Format class XcsvFile { public: - /* Special Member Functions */ - - XcsvFile() : mkshort_handle(mkshort_new_handle()) {} - // delete copy and move constructors and assignment operators. - // The defaults are not appropriate, and we haven't implemented proper ones. - XcsvFile(const XcsvFile&) = delete; - XcsvFile& operator=(const XcsvFile&) = delete; - XcsvFile(XcsvFile&&) = delete; - XcsvFile& operator=(XcsvFile&&) = delete; - ~XcsvFile() - { - if (mkshort_handle != nullptr) { - mkshort_del_handle(&mkshort_handle); - } - } /* Data Members */ gpsbabel::TextStream stream; QString fname; int gps_datum_idx{-1}; /* result of GPS_Lookup_Datum_Index */ - short_handle mkshort_handle{nullptr}; + MakeShort mkshort_handle; }; struct xcsv_parse_data { @@ -364,13 +350,10 @@ class XcsvFormat : public Format /* Member Functions */ static QDate yyyymmdd_to_time(const QString& s); - QDateTime xcsv_adjust_time(const QDate date, const QTime time, bool is_localtime) const; + QDateTime xcsv_adjust_time(QDate date, QTime time, bool is_localtime) const; static void sscanftime(const char* s, const char* format, QDate& date, QTime& time); - static QTime addhms(const char* s, const char* format); static QString writetime(const char* format, time_t t, bool gmt); static QString writetime(const char* format, const gpsbabel::DateTime& t, bool gmt); - static QString writehms(const char* format, time_t t, bool gmt); - static QString writehms(const char* format, const gpsbabel::DateTime& t, bool gmt); static long int time_to_yyyymmdd(const QDateTime& t); static garmin_fs_t* gmsd_init(Waypoint* wpt); static void xcsv_parse_val(const QString& value, Waypoint* wpt, const XcsvStyle::field_map& fmp, xcsv_parse_data* parse_data, int line_no); @@ -383,8 +366,7 @@ class XcsvFormat : public Format XcsvFile* xcsv_file{nullptr}; const XcsvStyle* xcsv_style{nullptr}; double pathdist = 0; - double oldlon = 999; - double oldlat = 999; + std::optional old_position; int waypt_out_count = 0; const route_head* csv_track = nullptr; diff --git a/xmldoc/chapters/build.xml b/xmldoc/chapters/build.xml index e0839d800..de92ffa54 100644 --- a/xmldoc/chapters/build.xml +++ b/xmldoc/chapters/build.xml @@ -289,7 +289,7 @@ distributed. The Qt provided translations still need to be distributed. - DOCVERSION + GPSBABEL_DOCVERSION string appended to documentation location for www.gpsbabel.org. The default @@ -300,12 +300,12 @@ www.gpsbabel.org. - WEB + GPSBABEL_WEB Path where the documentation will be stored for www.gpsbabel.org. This is used by the gpsbabel.org target, you are unlikely to need it unless you are -maintaining www.gpsbabel.org. The default location is "../babelweb" +maintaining www.gpsbabel.org. The default location is "gpsbabel.org". @@ -373,8 +373,7 @@ On non-macOS unix builds by default we now compile in the gpsbabel generated translation files, i.e. gpsbabelfe_*.qm, gpsbabel_*.qm, as well as gmapbase.html. When compiled in these files do not need to be distributed. These are used by the GUI. Additional translation files from Qt will also be -used if they are found. They may be in a package such as qttranslations5-l10n -or qt5-qttranslations. +used if they are found. They may be in a package such as qt6-translations-l10n. diff --git a/xmldoc/filters/options/simplify-error.xml b/xmldoc/filters/options/simplify-error.xml index 4e6a18417..8d7e8e5e8 100644 --- a/xmldoc/filters/options/simplify-error.xml +++ b/xmldoc/filters/options/simplify-error.xml @@ -3,7 +3,8 @@ This option specifies the maximum allowable error that may be introduced by removing a single point. Used with the and methods, the value of this option is a distance, specified in miles by default. You may also specify the distance in -kilometers by adding a 'k' to the end of the number. +kilometers by adding a 'k' to the end of the number, meters by adding a 'm', or +feet by adding 'ft'. For the method it is a dimensionless quantity. diff --git a/xmldoc/formats/cup.xml b/xmldoc/formats/cup.xml new file mode 100644 index 000000000..39e5bf59e --- /dev/null +++ b/xmldoc/formats/cup.xml @@ -0,0 +1,14 @@ + + This format supports flight analysis data from the +See You + program. + + + Position information is preserved, but the aviation-specific + information such as runway length and airport frequency, are + written as blanks and ignored on read. + + + Tasks are not supported. + + diff --git a/xmldoc/formats/globalsat.xml b/xmldoc/formats/globalsat.xml index b25fb655a..c46243e09 100644 --- a/xmldoc/formats/globalsat.xml +++ b/xmldoc/formats/globalsat.xml @@ -9,16 +9,6 @@ USB cable to your computer and the device will show up as a serial device. -gpsbabel -i globalsat -f /dev/ttyUSB0 -o gpx,garminextensions -F outfile.gpx - - Command showing list of tracks on device - gpsbabel -i globalsat,showlist=1 -f /dev/ttyUSB0 - - - Command track can be used to fetch a single track, default is all tracks - gpsbabel -i globalsat,track=number -f /dev/ttyUSB0 -o gpx,garminextensions -F outfile.gpx - - The gh625XT USB cable provides a physical USB interface to the host computer, but internally it uses a Prolific PL-2303 chip to do this. So you must have diff --git a/xmldoc/formats/unicsv.xml b/xmldoc/formats/unicsv.xml index bad010fdf..d75579c74 100644 --- a/xmldoc/formats/unicsv.xml +++ b/xmldoc/formats/unicsv.xml @@ -4,9 +4,13 @@ figure out what data it has and writes headers and all the data it can. - If the first line contains any tabs, the data lines are assumed - to be tab separated. Otherwise the fields are assumed to be - separated by commas. + Fields may be enclosed in double quotes. To include a double quote inside quotes escape it with another double quote. + + + If the first line contains any unenclosed tabs then the data lines are assumed to be tab separated. + Otherwise if the first line contains any unenclosed semicolons then fields are assumed to be separated by semicolons. + Otherwise if the first line contains any unenclosed vertical bars then fields are assumed to be separated by vertical bars. + Otherwise the fields are assumed to be separated by commas. The list of keywords include: @@ -29,7 +33,6 @@ diff = Geocache difficulty ele = Elevation (in meters). For feet use "ele ft", "eleft", "ele feet", or "elefeet". e/w = 'e' for eastern hemisphere, 'w' for western - exported = Geocache export date found = Geocache last found date fix = 3d, 2d, etc. gcid = Geocache cache id. This accepts GC-ID ("575006") and GC-Code ("GC1234G"). diff --git a/xmlgeneric.cc b/xmlgeneric.cc index 0d5a70c24..1aae5b6e7 100644 --- a/xmlgeneric.cc +++ b/xmlgeneric.cc @@ -19,37 +19,24 @@ */ -#include // for QByteArray -#include // for QHash -#include // for QIODevice, QIODevice::ReadOnly -#include // for QLatin1Char -#include -#include // for QStringView -#include // for QTextCodec -#include // for QXmlStreamAttributes -#include // for QXmlStreamReader, QXmlStreamReader::Characters, QXmlStreamReader::EndElement, QXmlStreamReader::IncludeChildElements, QXmlStreamReader::StartDocument, QXmlStreamReader::StartElement -#include // for qPrintable - -#include "defs.h" #include "xmlgeneric.h" -#include "src/core/file.h" // for File +#include // for as_const -enum xg_shortcut { - xg_shortcut_none = 0, - xg_shortcut_skip, - xg_shortcut_ignore -}; +#include // for QByteArray +#include // for QHash +#include // for QIODevice +#include // for QLatin1Char +#include // for QStringView +#include // for QTextCodec +#include // for QXmlStreamAttributes, QXmlStreamReader::Characters, QXmlStreamReader::EndElement, QXmlStreamReader::IncludeChildElements, QXmlStreamReader::StartDocument, QXmlStreamReader::StartElement +#include // for QXmlStreamReader +//#include // for QHash, QIODeviceBase::ReadOnly +#include // for qPrintable -static const QList* xg_tag_tbl; -static bool dynamic_tag_tbl; -static QHash* xg_shortcut_taglist; +#include "defs.h" // for fatal +#include "src/core/file.h" // for File -static QString rd_fname; -static QByteArray reader_data; -static const char* xg_encoding; -static QTextCodec* utf8_codec = QTextCodec::codecForName("UTF-8"); -static QTextCodec* codec = utf8_codec; // Qt has no vanilla ASCII encoding =( #define MYNAME "XML Reader" @@ -63,107 +50,60 @@ static QTextCodec* codec = utf8_codec; // Qt has no vanilla ASCII encoding =( * xml strains and insulates us from a lot of the grubbiness of expat. */ -static XgCallbackBase* -xml_tbl_lookup(const QString& tag, xg_cb_type cb_type) +XmlGenericReader::XgCallbackBase* +XmlGenericReader::xml_tbl_lookup(const QString& tag, xg_cb_type cb_type) { - for (const auto& tm : *xg_tag_tbl) { + for (const auto& tm : std::as_const(xg_tag_tbl)) { if (cb_type == tm.cb_type) { QRegularExpressionMatch match = tm.tag_re.match(tag); if (match.hasMatch()) { - return tm.tag_cb; + return tm.tag_cb.get(); } } } return nullptr; } -static void -xml_common_init(const QString& fname, const char* encoding, - const char* const* ignorelist, const char* const* skiplist) +void +XmlGenericReader::xml_common_init(const QString& fname, const char* encoding, + const char* const* ignorelist, const char* const* skiplist) { rd_fname = fname; - xg_encoding = encoding; - if (encoding) { - QTextCodec* tcodec = QTextCodec::codecForName(encoding); - if (tcodec) { - codec = tcodec; + if (encoding != nullptr) { + codec = QTextCodec::codecForName(encoding); + if (codec == nullptr) { + fatal(MYNAME " : codec \"%s\" is not available.\n", encoding); } + } else { + codec = QTextCodec::codecForName("UTF-8"); } - xg_shortcut_taglist = new QHash; + xg_shortcut_taglist.clear(); if (ignorelist != nullptr) { for (; ignorelist && *ignorelist; ++ignorelist) { - xg_shortcut_taglist->insert(QString::fromUtf8(*ignorelist), xg_shortcut_ignore); + xg_shortcut_taglist.insert(QString::fromUtf8(*ignorelist), xg_shortcut::sc_ignore); } } if (skiplist != nullptr) { for (; skiplist && *skiplist; ++skiplist) { - xg_shortcut_taglist->insert(QString::fromUtf8(*skiplist), xg_shortcut_skip); - } - } -} - -void -xml_init(const QString& fname, const QList* tbl, const char* encoding, - const char* const* ignorelist, const char* const* skiplist, bool dynamic_tbl) -{ - xg_tag_tbl = tbl; - dynamic_tag_tbl = dynamic_tbl; - - xml_common_init(fname, encoding, ignorelist, skiplist); -} - -void -xml_init(const QString& fname, const QList& tbl, const char* encoding, - const char* const* ignorelist, const char* const* skiplist) -{ - auto* tag_tbl = new QList; - dynamic_tag_tbl = true; - for (const auto& tm : tbl) { - auto* cb = new XgFunctionPtrCallback(tm.tag_cb); - QRegularExpression re(QRegularExpression::anchoredPattern(tm.tag_pattern)); - assert(re.isValid()); - tag_tbl->append({cb, tm.cb_type, re}); - } - xg_tag_tbl = tag_tbl; - - xml_common_init(fname, encoding, ignorelist, skiplist); -} - -void -xml_deinit() -{ - if (dynamic_tag_tbl) { - for (const auto& tm : *xg_tag_tbl) { - delete tm.tag_cb; + xg_shortcut_taglist.insert(QString::fromUtf8(*skiplist), xg_shortcut::sc_skip); } - delete xg_tag_tbl; } - xg_tag_tbl = nullptr; - - reader_data.clear(); - rd_fname.clear(); - - xg_encoding = nullptr; - codec = utf8_codec; - - delete xg_shortcut_taglist; - xg_shortcut_taglist = nullptr; } -static xg_shortcut -xml_shortcut(QStringView name) +XmlGenericReader::xg_shortcut +XmlGenericReader::xml_shortcut(QStringView name) { QString key = name.toString(); - if (xg_shortcut_taglist->contains(key)) { - return xg_shortcut_taglist->value(key); + if (xg_shortcut_taglist.contains(key)) { + return xg_shortcut_taglist.value(key); } - return xg_shortcut_none; + return xg_shortcut::sc_none; } -static void -xml_run_parser(QXmlStreamReader& reader) +void +XmlGenericReader::xml_run_parser(QXmlStreamReader& reader) { XgCallbackBase* cb; QString current_tag; @@ -184,10 +124,10 @@ xml_run_parser(QXmlStreamReader& reader) case QXmlStreamReader::StartElement: switch (xml_shortcut(reader.name())) { - case xg_shortcut_skip: + case xg_shortcut::sc_skip: reader.skipCurrentElement(); goto readnext; - case xg_shortcut_ignore: + case xg_shortcut::sc_ignore: goto readnext; default: break; @@ -196,13 +136,13 @@ xml_run_parser(QXmlStreamReader& reader) current_tag.append(QLatin1Char('/')); current_tag.append(reader.qualifiedName()); - cb = xml_tbl_lookup(current_tag, cb_start); + cb = xml_tbl_lookup(current_tag, xg_cb_type::cb_start); if (cb) { const QXmlStreamAttributes attrs = reader.attributes(); (*cb)(nullptr, &attrs); } - cb = xml_tbl_lookup(current_tag, cb_cdata); + cb = xml_tbl_lookup(current_tag, xg_cb_type::cb_cdata); if (cb) { QString c = reader.readElementText(QXmlStreamReader::IncludeChildElements); // readElementText advances the tokenType to QXmlStreamReader::EndElement, @@ -215,11 +155,11 @@ xml_run_parser(QXmlStreamReader& reader) break; case QXmlStreamReader::EndElement: - if (xml_shortcut(reader.name()) == xg_shortcut_skip) { + if (xml_shortcut(reader.name()) == xg_shortcut::sc_skip) { goto readnext; } - cb = xml_tbl_lookup(current_tag, cb_end); + cb = xml_tbl_lookup(current_tag, xg_cb_type::cb_end); if (cb) { (*cb)(reader.name().toString(), nullptr); } @@ -242,7 +182,7 @@ xml_run_parser(QXmlStreamReader& reader) } } -void xml_read() +void XmlGenericReader::xml_read() { gpsbabel::File file(rd_fname); @@ -252,7 +192,7 @@ void xml_read() xml_run_parser(reader); if (reader.hasError()) { - fatal(MYNAME ":Read error: %s (%s, line %lld, col %lld)\n", + fatal(MYNAME " :Read error: %s (%s, line %lld, col %lld)\n", qPrintable(reader.errorString()), qPrintable(file.fileName()), reader.lineNumber(), @@ -262,14 +202,14 @@ void xml_read() // Chucks some bytes into the global QByteArray buffer and waits for // xml_readstring() to parse. -void xml_readprefixstring(const char* str) +void XmlGenericReader::xml_readprefixstring(const char* str) { reader_data.append(str); } // Parses a bytestream as if it were a file. Looks for an // for assert +#include // for make_shared, shared_ptr +#include // for QByteArray +#include // for QHash #include // for QList #include // for QRegularExpression #include // for QString +#include // for QStringView +#include // for QTextCodec #include // for QXmlStreamAttributes +#include // for QXmlStreamReader -// Maybe the XmlGeneric string callback really shouldn't have a type -// of its own; this was a crutch during the move from char* to QString. -// It's "just" a search and replace to make it go away, but it might -// be convenient to overload some day. -using xg_string = const QString&; - -enum xg_cb_type { - cb_start = 1, +enum class xg_cb_type { + cb_unknown = 0, + cb_start, cb_cdata, cb_end, }; -class XgCallbackBase -{ -public: - XgCallbackBase() = default; - virtual ~XgCallbackBase() = default; - XgCallbackBase(const XgCallbackBase&) = delete; - XgCallbackBase& operator=(const XgCallbackBase&) = delete; - XgCallbackBase(XgCallbackBase&&) = delete; - XgCallbackBase& operator=(XgCallbackBase&&) = delete; - - virtual void operator()(xg_string string, const QXmlStreamAttributes* attrs) const = 0; -}; - -template -class XgFunctor : public XgCallbackBase +/* + * xml_init will build and own a table of XgFunctor and/or + * XgFunctionPtrCallback entries from a list + * of non-static member functions and/or function pointers. + * + * QList> some_map = { + * {&SomeFormat::memberfn, cb_start, "/Placemark"}, + * {staticfn, cb_cdata, "/Placemark/coord"}, + * }; + * + * The this pointer from the Format instance must be passed if any + * of the callbacks are member functions, otherwise nullptr can be passed + * as this. + * + * xml_init(fname, this, some_map, encoding, ignorelist, skiplist); + * + */ +class XmlGenericReader { public: - using XgCb = void (XgFormat::*)(xg_string, const QXmlStreamAttributes*); - XgFunctor(XgFormat* obj, XgCb cb) : that_(obj), cb_(cb) {} - void operator()(xg_string string, const QXmlStreamAttributes* attrs) const override + /* Types */ + + // formats pass a list containing member function pointers and/or function pointers. + template + struct xg_fmt_map_entry { + // Constructor from a Member Function Pointer + using XgMfpCb = void (MyFormat::*)(const QString&, const QXmlStreamAttributes*); + xg_fmt_map_entry(XgMfpCb mfp, xg_cb_type ty, const char* tp) : tag_mfp_cb(mfp), cb_type(ty), tag_pattern(tp) {} + // Constructor from a Function Pointer. + using XgFpCb = void (const QString&, const QXmlStreamAttributes*); + xg_fmt_map_entry(XgFpCb fp, xg_cb_type ty, const char* tp) : tag_fp_cb(fp), cb_type(ty), tag_pattern(tp) {} + + /* Data Members */ + + XgMfpCb tag_mfp_cb{nullptr}; + XgFpCb* tag_fp_cb{nullptr}; + xg_cb_type cb_type{xg_cb_type::cb_unknown}; + const char* tag_pattern{nullptr}; + }; + + /* Member Functions */ + + template + void xml_init(const QString& fname, MyFormat* instance, const QList>& tbl, + const char* encoding = nullptr, + const char* const* ignorelist = nullptr, + const char* const* skiplist = nullptr) { - (that_->*cb_)(string, attrs); + build_xg_tag_map(instance, tbl); + + xml_common_init(fname, encoding, ignorelist, skiplist); } + void xml_read(); + void xml_readstring(const char* str); + void xml_readprefixstring(const char* str); + void xml_readunicode(const QString& str); + private: - XgFormat* that_; - XgCb cb_; -}; + /* Types */ -class XgFunctionPtrCallback : public XgCallbackBase -{ -public: - using XgCb = void (xg_string, const QXmlStreamAttributes*); - explicit XgFunctionPtrCallback(XgCb cb) : cb_(cb) {} - void operator()(xg_string string, const QXmlStreamAttributes* attrs) const override + class XgCallbackBase + { + public: + XgCallbackBase() = default; + virtual ~XgCallbackBase() = default; + XgCallbackBase(const XgCallbackBase&) = delete; + XgCallbackBase& operator=(const XgCallbackBase&) = delete; + XgCallbackBase(XgCallbackBase&&) = delete; + XgCallbackBase& operator=(XgCallbackBase&&) = delete; + + virtual void operator()(const QString& string, const QXmlStreamAttributes* attrs) const = 0; + }; + + template + class XgFunctor : public XgCallbackBase { - (*cb_)(string, attrs); + public: + using XgCb = void (XgFormat::*)(const QString&, const QXmlStreamAttributes*); + XgFunctor(XgFormat* obj, XgCb cb) : that_(obj), cb_(cb) {} + void operator()(const QString& string, const QXmlStreamAttributes* attrs) const override + { + (that_->*cb_)(string, attrs); + } + + private: + XgFormat* that_; + XgCb cb_; + }; + + class XgFunctionPtrCallback : public XgCallbackBase + { + public: + using XgCb = void (const QString&, const QXmlStreamAttributes*); + explicit XgFunctionPtrCallback(XgCb cb) : cb_(cb) {} + void operator()(const QString& string, const QXmlStreamAttributes* attrs) const override + { + (*cb_)(string, attrs); + } + + private: + XgCb* cb_; + }; + + // xml processing uses a list of xg_tag_map_entries. + struct xg_tag_map_entry { + std::shared_ptr tag_cb{nullptr}; + xg_cb_type cb_type{xg_cb_type::cb_unknown}; + QRegularExpression tag_re; + }; + + enum class xg_shortcut { + sc_none = 0, + sc_skip, + sc_ignore + }; + + /* Member Functions */ + + XgCallbackBase* xml_tbl_lookup(const QString& tag, xg_cb_type cb_type); + void xml_common_init(const QString& fname, const char* encoding, + const char* const* ignorelist, const char* const* skiplist); + xg_shortcut xml_shortcut(QStringView name); + void xml_run_parser(QXmlStreamReader& reader); + + // translate xg_fmt_map_entries to xg_tag_map_entries. + template + void build_xg_tag_map(MyFormat* instance, const QList>& map) + { + xg_tag_tbl.clear(); + for (const auto& entry : map) { + xg_tag_map_entry tme; + if (entry.tag_mfp_cb != nullptr) { + tme.tag_cb = std::make_shared>(instance, entry.tag_mfp_cb); + } else { + tme.tag_cb = std::make_shared(entry.tag_fp_cb); + } + QRegularExpression re(QRegularExpression::anchoredPattern(entry.tag_pattern)); + assert(re.isValid()); + tme.cb_type = entry.cb_type; + tme.tag_re = re; + xg_tag_tbl.append(tme); + } } -private: - XgCb* cb_; -}; + /* Data Members */ -// xml processing uses a QList. -// You may generated this yourself. See method 1 below. -// Or it may be generated for you using one of the subsequent -// methods. -struct xg_tag_map_entry { - XgCallbackBase* tag_cb; - xg_cb_type cb_type; - QRegularExpression tag_re; -}; + QList xg_tag_tbl; + QHash xg_shortcut_taglist; -// Table generation from an array containing function pointers. -// The above table can be generated by xml_init. See method 2 below. -// This is how things done historically before the Format class was -// introduced. -using xg_callback = void (xg_string, const QXmlStreamAttributes*); -struct xg_tag_mapping { - xg_callback* tag_cb; - xg_cb_type cb_type; - const char* tag_pattern; -}; + QString rd_fname; + QByteArray reader_data; + QTextCodec* codec{nullptr}; // Qt has no vanilla ASCII encoding =( -// Table generation from a list containing member function pointers. -// The above table can be generated by xml_init. See method 3 below. -template -struct xg_functor_map_entry { - using XgCb = void (MyFormat::*)(xg_string, const QXmlStreamAttributes*); - XgCb tag_cb; - xg_cb_type cb_type; - const char* tag_pattern; }; -template -QList* build_xg_tag_map(MyFormat* instance, const QList& map) -{ - auto* tag_tbl = new QList; - for (const auto& entry : map) { - auto* tag_cb = new XgFunctor(instance, entry.tag_cb); - QRegularExpression re(QRegularExpression::anchoredPattern(entry.tag_pattern)); - assert(re.isValid()); - tag_tbl->append({tag_cb, entry.cb_type, re}); - } - return tag_tbl; -} - -/* - * There are multiple ways to initialize with xml_init. - * - * 1. Build your own QList, and pass it. - * You own the table, you must do any required clean up. - * Your callbacks may be a mix of function pointers wrapped in XgFunctors - * and non-static member functions wrapped in XgFunctionPtrCallbacks. - * and XgFunctionPtrCallback(for static member functions or global functions) entries. - * xml_init(fname, tbl, encoding, ignorelist, skiplist, false); - * You must set the dynamic_tbl parameter to false so xml_deninit doesn't - * attempt to free the table resources when xml_deinit is called. - * - * 2. Have xml_init build and own a table of XgFunctionPtrCallback entries - * from an list of function pointers, i.e. a QList of xg_tag_mapping elements. - * This only works when all callbacks are function pointers. - * xml_init(fname, tbl, encoding, ignorelist, skiplist); - * Generated table entries will automatically be freed. - * - * 3. Have xml_init build and own a table of XgFunctor entries from a list - * of non-static member functions, i.e. a QList. - * This only works when all callbacks are non-static member functions. - * xml_init(fname, build_xg_tag_map(instance, map), encoding, ignorelist, skiplist, true); - * You must set the dynamic_tbl parameter to true to free the generated table - * resources when xml_deinit is called. - * - */ -void xml_init(const QString& fname, const QList* tbl, const char* encoding, - const char* const* ignorelist = nullptr, - const char* const* skiplist = nullptr, bool dynamic_tbl = false); -void xml_init(const QString& fname, const QList& tbl,const char* encoding, - const char* const* ignorelist = nullptr, - const char* const* skiplist = nullptr); -void xml_read(); -void xml_readstring(const char* str); -void xml_readprefixstring(const char* str); -void xml_readunicode(const QString& str); -void xml_deinit(); - #endif // XMLGENERIC_H_INCLUDED_ diff --git a/zlib/ChangeLog b/zlib/ChangeLog index 457526bc6..b801a1031 100644 --- a/zlib/ChangeLog +++ b/zlib/ChangeLog @@ -1,6 +1,34 @@ ChangeLog file for zlib +Changes in 1.3.1 (22 Jan 2024) +- Reject overflows of zip header fields in minizip +- Fix bug in inflateSync() for data held in bit buffer +- Add LIT_MEM define to use more memory for a small deflate speedup +- Fix decision on the emission of Zip64 end records in minizip +- Add bounds checking to ERR_MSG() macro, used by zError() +- Neutralize zip file traversal attacks in miniunz +- Fix a bug in ZLIB_DEBUG compiles in check_match() +- Various portability and appearance improvements + +Changes in 1.3 (18 Aug 2023) +- Remove K&R function definitions and zlib2ansi +- Fix bug in deflateBound() for level 0 and memLevel 9 +- Fix bug when gzungetc() is used immediately after gzopen() +- Fix bug when using gzflush() with a very small buffer +- Fix crash when gzsetparams() attempted for transparent write +- Fix test/example.c to work with FORCE_STORED +- Rewrite of zran in examples (see zran.c version history) +- Fix minizip to allow it to open an empty zip file +- Fix reading disk number start on zip64 files in minizip +- Fix logic error in minizip argument processing +- Add minizip testing to Makefile +- Read multiple bytes instead of byte-by-byte in minizip unzip.c +- Add memory sanitizer to configure (--memory) +- Various portability improvements +- Various documentation improvements +- Various spelling and typo corrections + Changes in 1.2.13 (13 Oct 2022) - Fix configure issue that discarded provided CC definition - Correct incorrect inputs provided to the CRC functions @@ -1445,7 +1473,7 @@ Changes in 0.99 (27 Jan 96) - fix typo in Make_vms.com (f$trnlnm -> f$getsyi) - in fcalloc, normalize pointer if size > 65520 bytes - don't use special fcalloc for 32 bit Borland C++ -- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc. - use Z_BINARY instead of BINARY - document that gzclose after gzdopen will close the file - allow "a" as mode in gzopen diff --git a/zlib/FAQ b/zlib/FAQ index 99b7cf92e..92f5d3e29 100644 --- a/zlib/FAQ +++ b/zlib/FAQ @@ -4,7 +4,7 @@ If your question is not there, please check the zlib home page http://zlib.net/ which may have more recent information. -The lastest zlib FAQ is at http://zlib.net/zlib_faq.html +The latest zlib FAQ is at http://zlib.net/zlib_faq.html 1. Is zlib Y2K-compliant? @@ -14,8 +14,7 @@ The lastest zlib FAQ is at http://zlib.net/zlib_faq.html 2. Where can I get a Windows DLL version? The zlib sources can be compiled without change to produce a DLL. See the - file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the - precompiled DLL are found in the zlib web site at http://zlib.net/ . + file win32/DLL_FAQ.txt in the zlib distribution. 3. Where can I get a Visual Basic interface to zlib? diff --git a/zlib/Makefile.in b/zlib/Makefile.in deleted file mode 100644 index 7d2713f4c..000000000 --- a/zlib/Makefile.in +++ /dev/null @@ -1,404 +0,0 @@ -# Makefile for zlib -# Copyright (C) 1995-2017 Jean-loup Gailly, Mark Adler -# For conditions of distribution and use, see copyright notice in zlib.h - -# To compile and test, type: -# ./configure; make test -# Normally configure builds both a static and a shared library. -# If you want to build just a static library, use: ./configure --static - -# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: -# make install -# To install in $HOME instead of /usr/local, use: -# make install prefix=$HOME - -CC=cc - -CFLAGS=-O -#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 -#CFLAGS=-g -DZLIB_DEBUG -#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ -# -Wstrict-prototypes -Wmissing-prototypes - -SFLAGS=-O -LDFLAGS= -TEST_LDFLAGS=$(LDFLAGS) -L. libz.a -LDSHARED=$(CC) -CPP=$(CC) -E - -STATICLIB=libz.a -SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.13 -SHAREDLIBM=libz.so.1 -LIBS=$(STATICLIB) $(SHAREDLIBV) - -AR=ar -ARFLAGS=rc -RANLIB=ranlib -LDCONFIG=ldconfig -LDSHAREDLIBC=-lc -TAR=tar -SHELL=/bin/sh -EXE= - -prefix = /usr/local -exec_prefix = ${prefix} -libdir = ${exec_prefix}/lib -sharedlibdir = ${libdir} -includedir = ${prefix}/include -mandir = ${prefix}/share/man -man3dir = ${mandir}/man3 -pkgconfigdir = ${libdir}/pkgconfig -SRCDIR= -ZINC= -ZINCOUT=-I. - -OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o -OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o -OBJC = $(OBJZ) $(OBJG) - -PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo -PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo -PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) - -# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo -OBJA = -PIC_OBJA = - -OBJS = $(OBJC) $(OBJA) - -PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) - -all: static shared - -static: example$(EXE) minigzip$(EXE) - -shared: examplesh$(EXE) minigzipsh$(EXE) - -all64: example64$(EXE) minigzip64$(EXE) - -check: test - -test: all teststatic testshared - -teststatic: static - @TMPST=tmpst_$$; \ - if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST ; then \ - echo ' *** zlib test OK ***'; \ - else \ - echo ' *** zlib test FAILED ***'; false; \ - fi - @rm -f tmpst_$$ - -testshared: shared - @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ - LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ - DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ - SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ - TMPSH=tmpsh_$$; \ - if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH; then \ - echo ' *** zlib shared test OK ***'; \ - else \ - echo ' *** zlib shared test FAILED ***'; false; \ - fi - @rm -f tmpsh_$$ - -test64: all64 - @TMP64=tmp64_$$; \ - if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64; then \ - echo ' *** zlib 64-bit test OK ***'; \ - else \ - echo ' *** zlib 64-bit test FAILED ***'; false; \ - fi - @rm -f tmp64_$$ - -infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c - -infcover: infcover.o libz.a - $(CC) $(CFLAGS) -o $@ infcover.o libz.a - -cover: infcover - rm -f *.gcda - ${QEMU_RUN} ./infcover - gcov inf*.c - -libz.a: $(OBJS) - $(AR) $(ARFLAGS) $@ $(OBJS) - -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 - -match.o: match.S - $(CPP) match.S > _match.s - $(CC) -c _match.s - mv _match.o match.o - rm -f _match.s - -match.lo: match.S - $(CPP) match.S > _match.s - $(CC) -c -fPIC _match.s - mv _match.o match.lo - rm -f _match.s - -example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c - -minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c - -example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c - -minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/minigzip.c - - -adler32.o: $(SRCDIR)adler32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c - -crc32.o: $(SRCDIR)crc32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c - -deflate.o: $(SRCDIR)deflate.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c - -infback.o: $(SRCDIR)infback.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c - -inffast.o: $(SRCDIR)inffast.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inffast.c - -inflate.o: $(SRCDIR)inflate.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inflate.c - -inftrees.o: $(SRCDIR)inftrees.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inftrees.c - -trees.o: $(SRCDIR)trees.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c - -zutil.o: $(SRCDIR)zutil.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c - -compress.o: $(SRCDIR)compress.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)compress.c - -uncompr.o: $(SRCDIR)uncompr.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)uncompr.c - -gzclose.o: $(SRCDIR)gzclose.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzclose.c - -gzlib.o: $(SRCDIR)gzlib.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzlib.c - -gzread.o: $(SRCDIR)gzread.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzread.c - -gzwrite.o: $(SRCDIR)gzwrite.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzwrite.c - - -adler32.lo: $(SRCDIR)adler32.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c - -@mv objs/adler32.o $@ - -crc32.lo: $(SRCDIR)crc32.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c - -@mv objs/crc32.o $@ - -deflate.lo: $(SRCDIR)deflate.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c - -@mv objs/deflate.o $@ - -infback.lo: $(SRCDIR)infback.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c - -@mv objs/infback.o $@ - -inffast.lo: $(SRCDIR)inffast.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inffast.o $(SRCDIR)inffast.c - -@mv objs/inffast.o $@ - -inflate.lo: $(SRCDIR)inflate.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inflate.o $(SRCDIR)inflate.c - -@mv objs/inflate.o $@ - -inftrees.lo: $(SRCDIR)inftrees.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inftrees.o $(SRCDIR)inftrees.c - -@mv objs/inftrees.o $@ - -trees.lo: $(SRCDIR)trees.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c - -@mv objs/trees.o $@ - -zutil.lo: $(SRCDIR)zutil.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/zutil.o $(SRCDIR)zutil.c - -@mv objs/zutil.o $@ - -compress.lo: $(SRCDIR)compress.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/compress.o $(SRCDIR)compress.c - -@mv objs/compress.o $@ - -uncompr.lo: $(SRCDIR)uncompr.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/uncompr.o $(SRCDIR)uncompr.c - -@mv objs/uncompr.o $@ - -gzclose.lo: $(SRCDIR)gzclose.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzclose.o $(SRCDIR)gzclose.c - -@mv objs/gzclose.o $@ - -gzlib.lo: $(SRCDIR)gzlib.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzlib.o $(SRCDIR)gzlib.c - -@mv objs/gzlib.o $@ - -gzread.lo: $(SRCDIR)gzread.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzread.o $(SRCDIR)gzread.c - -@mv objs/gzread.o $@ - -gzwrite.lo: $(SRCDIR)gzwrite.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzwrite.o $(SRCDIR)gzwrite.c - -@mv objs/gzwrite.o $@ - - -placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a - $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) - rm -f $(SHAREDLIB) $(SHAREDLIBM) - ln -s $@ $(SHAREDLIB) - ln -s $@ $(SHAREDLIBM) - -@rmdir objs - -example$(EXE): example.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) - -minigzip$(EXE): minigzip.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) - -examplesh$(EXE): example.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV) - -minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV) - -example64$(EXE): example64.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) - -minigzip64$(EXE): minigzip64.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) - -install-libs: $(LIBS) - -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi - -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi - -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi - -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi - -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi - rm -f $(DESTDIR)$(libdir)/$(STATICLIB) - cp $(STATICLIB) $(DESTDIR)$(libdir) - chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) - -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 - -@if test -n "$(SHAREDLIBV)"; then \ - rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ - cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ - echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ - chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ - echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ - rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ - ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ - ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ - ($(LDCONFIG) || true) >/dev/null 2>&1; \ - fi - rm -f $(DESTDIR)$(man3dir)/zlib.3 - cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir) - chmod 644 $(DESTDIR)$(man3dir)/zlib.3 - rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc - cp zlib.pc $(DESTDIR)$(pkgconfigdir) - chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc -# The ranlib in install is needed on NeXTSTEP which checks file times -# ldconfig is for Linux - -install: install-libs - -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi - rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h - cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir) - chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h - -uninstall: - cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h - cd $(DESTDIR)$(libdir) && rm -f libz.a; \ - if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ - rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ - fi - cd $(DESTDIR)$(man3dir) && rm -f zlib.3 - cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc - -docs: zlib.3.pdf - -zlib.3.pdf: $(SRCDIR)zlib.3 - groff -mandoc -f H -T ps $(SRCDIR)zlib.3 | ps2pdf - $@ - -zconf.h.cmakein: $(SRCDIR)zconf.h.in - -@ TEMPFILE=zconfh_$$; \ - echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ - sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\ - touch -r $(SRCDIR)zconf.h.in $@ &&\ - rm $$TEMPFILE - -zconf: $(SRCDIR)zconf.h.in - cp -p $(SRCDIR)zconf.h.in zconf.h - -mostlyclean: clean -clean: - rm -f *.o *.lo *~ \ - example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ - example64$(EXE) minigzip64$(EXE) \ - infcover \ - libz.* foo.gz so_locations \ - _match.s maketree contrib/infback9/*.o - rm -rf objs - rm -f *.gcda *.gcno *.gcov - rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov - -maintainer-clean: distclean -distclean: clean zconf zconf.h.cmakein - rm -f Makefile zlib.pc configure.log - -@rm -f .DS_Store - @if [ -f Makefile.in ]; then \ - printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \ - printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \ - touch -r $(SRCDIR)Makefile.in Makefile ; fi - -tags: - etags $(SRCDIR)*.[ch] - -adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h -gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h -compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h -crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h -deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h -infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h -inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h -trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h - -adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h -gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h -compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h -crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h -deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h -infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -inffast.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h -inftrees.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h -trees.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h diff --git a/zlib/README b/zlib/README index ba34d1894..c5f917540 100644 --- a/zlib/README +++ b/zlib/README @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.13 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -29,18 +29,17 @@ PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at -http://marknelson.us/1997/01/01/zlib-engine/ . +https://marknelson.us/posts/1997/01/01/zlib-engine.html . -The changes made in version 1.2.13 are documented in the file ChangeLog. +The changes made in version 1.3.1 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . -zlib is available in Java using the java.util.zip package, documented at -http://java.sun.com/developer/technicalArticles/Programming/compression/ . +zlib is available in Java using the java.util.zip package. Follow the API +Documentation link at: https://docs.oracle.com/search/?q=java.util.zip . -A Perl interface to zlib written by Paul Marquess is available -at CPAN (Comprehensive Perl Archive Network) sites, including -http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . +A Perl interface to zlib and bzip2 written by Paul Marquess +can be found at https://github.com/pmqs/IO-Compress . A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see @@ -64,7 +63,7 @@ Notes for some targets: - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is +- On Digital Unix 4.0D (formerly OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with @@ -84,7 +83,7 @@ Acknowledgments: Copyright notice: - (C) 1995-2022 Jean-loup Gailly and Mark Adler + (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/zlib/README.gpsbabel b/zlib/README.gpsbabel index 89f60f9f8..ca73a1031 100644 --- a/zlib/README.gpsbabel +++ b/zlib/README.gpsbabel @@ -1,5 +1,3 @@ -modified subset of zlib-1.2.13 from zlib.net. +modified subset of zlib-1.3.1 from zlib.net. note that zlib 1.2.8 has a seek bug that will bite us. other changes after zlib 1.2.8 may be required as well. -1. contrib/minizip/ioapi.c modifies a conditional adding __CYGWIN__ -See the corresponding .patch files. diff --git a/zlib/adler32.c b/zlib/adler32.c index d0be4380a..04b81d29b 100644 --- a/zlib/adler32.c +++ b/zlib/adler32.c @@ -7,8 +7,6 @@ #include "zutil.h" -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - #define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -60,11 +58,7 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #endif /* ========================================================================= */ -uLong ZEXPORT adler32_z(adler, buf, len) - uLong adler; - const Bytef *buf; - z_size_t len; -{ +uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) { unsigned long sum2; unsigned n; @@ -131,20 +125,12 @@ uLong ZEXPORT adler32_z(adler, buf, len) } /* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ +uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) { return adler32_z(adler, buf, len); } /* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) { unsigned long sum1; unsigned long sum2; unsigned rem; @@ -169,18 +155,10 @@ local uLong adler32_combine_(adler1, adler2, len2) } /* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ +uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) { return adler32_combine_(adler1, adler2, len2); } -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) { return adler32_combine_(adler1, adler2, len2); } diff --git a/zlib/algorithm.txt b/zlib/algorithm.txt index c97f49502..029e5a313 100644 --- a/zlib/algorithm.txt +++ b/zlib/algorithm.txt @@ -77,7 +77,7 @@ table took no time (and if you had infinite memory), then there would only be a first level table to cover all the way to the longest code. However, building the table ends up taking a lot longer for more bits since short codes are replicated many times in such a table. What inflate() does is -simply to make the number of bits in the first table a variable, and then +simply to make the number of bits in the first table a variable, and then to set that variable for the maximum speed. For inflate, which has 286 possible codes for the literal/length tree, the size diff --git a/zlib/compress.c b/zlib/compress.c index 2ad5326c1..f43bacf7a 100644 --- a/zlib/compress.c +++ b/zlib/compress.c @@ -19,13 +19,8 @@ memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ -int ZEXPORT compress2(dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ +int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, int level) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -65,12 +60,8 @@ int ZEXPORT compress2(dest, destLen, source, sourceLen, level) /* =========================================================================== */ -int ZEXPORT compress(dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } @@ -78,9 +69,7 @@ int ZEXPORT compress(dest, destLen, source, sourceLen) If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ -uLong ZEXPORT compressBound(sourceLen) - uLong sourceLen; -{ +uLong ZEXPORT compressBound(uLong sourceLen) { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } diff --git a/zlib/contrib/minizip/Makefile b/zlib/contrib/minizip/Makefile index aac76e07f..3d927ec14 100644 --- a/zlib/contrib/minizip/Makefile +++ b/zlib/contrib/minizip/Makefile @@ -1,4 +1,4 @@ -CC=cc +CC?=cc CFLAGS := $(CFLAGS) -O -I../.. UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a diff --git a/zlib/contrib/minizip/MiniZip64_Changes.txt b/zlib/contrib/minizip/MiniZip64_Changes.txt index 13a1bd91a..375946811 100644 --- a/zlib/contrib/minizip/MiniZip64_Changes.txt +++ b/zlib/contrib/minizip/MiniZip64_Changes.txt @@ -1,5 +1,5 @@ -MiniZip 1.1 was derrived from MiniZip at version 1.01f +MiniZip 1.1 was derived from MiniZip at version 1.01f Change in 1.0 (Okt 2009) - **TODO - Add history** diff --git a/zlib/contrib/minizip/configure.ac b/zlib/contrib/minizip/configure.ac index bff300b30..15ec91718 100644 --- a/zlib/contrib/minizip/configure.ac +++ b/zlib/contrib/minizip/configure.ac @@ -1,7 +1,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_INIT([minizip], [1.2.13], [bugzilla.redhat.com]) +AC_INIT([minizip], [1.3.1], [bugzilla.redhat.com]) AC_CONFIG_SRCDIR([minizip.c]) AM_INIT_AUTOMAKE([foreign]) LT_INIT diff --git a/zlib/contrib/minizip/crypt.h b/zlib/contrib/minizip/crypt.h index 1cc41f19d..f4b93b78d 100644 --- a/zlib/contrib/minizip/crypt.h +++ b/zlib/contrib/minizip/crypt.h @@ -32,8 +32,7 @@ /*********************************************************************** * Return the next byte in the pseudo-random sequence */ -static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) -{ +static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) { unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ @@ -46,8 +45,7 @@ static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) /*********************************************************************** * Update the encryption keys with the next byte of plain text */ -static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) -{ +static int update_keys(unsigned long* pkeys, const z_crc_t* pcrc_32_tab, int c) { (*(pkeys+0)) = CRC32((*(pkeys+0)), c); (*(pkeys+1)) += (*(pkeys+0)) & 0xff; (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; @@ -63,8 +61,7 @@ static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) * Initialize the encryption keys and the random header according to * the given password. */ -static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) -{ +static void init_keys(const char* passwd, unsigned long* pkeys, const z_crc_t* pcrc_32_tab) { *(pkeys+0) = 305419896L; *(pkeys+1) = 591751049L; *(pkeys+2) = 878082192L; @@ -93,8 +90,7 @@ static unsigned crypthead(const char* passwd, /* password string */ int bufSize, unsigned long* pkeys, const z_crc_t* pcrc_32_tab, - unsigned long crcForCrypting) -{ + unsigned long crcForCrypting) { unsigned n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ diff --git a/zlib/contrib/minizip/ioapi.c b/zlib/contrib/minizip/ioapi.c index 7b9befe83..782d32469 100644 --- a/zlib/contrib/minizip/ioapi.c +++ b/zlib/contrib/minizip/ioapi.c @@ -14,7 +14,7 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#if defined(__APPLE__) || defined(IOAPI_NO_64) || defined(__CYGWIN__) +#if defined(__APPLE__) || defined(IOAPI_NO_64) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -28,8 +28,7 @@ #include "ioapi.h" -voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) -{ +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc, const void*filename, int mode) { if (pfilefunc->zfile_func64.zopen64_file != NULL) return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); else @@ -38,8 +37,7 @@ voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename } } -long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) -{ +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) { if (pfilefunc->zfile_func64.zseek64_file != NULL) return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); else @@ -52,8 +50,7 @@ long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZP } } -ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) -{ +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc, voidpf filestream) { if (pfilefunc->zfile_func64.zseek64_file != NULL) return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); else @@ -66,11 +63,9 @@ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream } } -void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) -{ +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32, const zlib_filefunc_def* p_filefunc32) { p_filefunc64_32->zfile_func64.zopen64_file = NULL; p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; - p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; p_filefunc64_32->zfile_func64.ztell64_file = NULL; @@ -84,16 +79,7 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef -static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); -static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); -static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); -static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); -static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); - -static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) -{ +static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; (void)opaque; @@ -111,8 +97,7 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in return file; } -static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) -{ +static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; (void)opaque; @@ -131,24 +116,21 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, } -static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) -{ +static uLong ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uLong size) { uLong ret; (void)opaque; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } -static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) -{ +static uLong ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret; (void)opaque; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } -static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) -{ +static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream) { long ret; (void)opaque; ret = ftell((FILE *)stream); @@ -156,16 +138,14 @@ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) } -static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) -{ +static ZPOS64_T ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream) { ZPOS64_T ret; (void)opaque; ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream); return ret; } -static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) -{ +static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) { int fseek_origin=0; long ret; (void)opaque; @@ -188,8 +168,7 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs return ret; } -static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) -{ +static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) { int fseek_origin=0; long ret; (void)opaque; @@ -208,32 +187,28 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T } ret = 0; - if(FSEEKO_FUNC((FILE *)stream, (z_off_t)offset, fseek_origin) != 0) + if(FSEEKO_FUNC((FILE *)stream, (z_off64_t)offset, fseek_origin) != 0) ret = -1; return ret; } -static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) -{ +static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream) { int ret; (void)opaque; ret = fclose((FILE *)stream); return ret; } -static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) -{ +static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream) { int ret; (void)opaque; ret = ferror((FILE *)stream); return ret; } -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; -{ +void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; @@ -244,8 +219,7 @@ void fill_fopen_filefunc (pzlib_filefunc_def) pzlib_filefunc_def->opaque = NULL; } -void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = fopen64_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; diff --git a/zlib/contrib/minizip/ioapi.c.patch b/zlib/contrib/minizip/ioapi.c.patch deleted file mode 100644 index 54f1b8f77..000000000 --- a/zlib/contrib/minizip/ioapi.c.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../zlib-1.2.8/contrib/minizip/ioapi.c 2012-01-21 12:58:45.000000000 -0700 -+++ zlib/contrib/minizip/ioapi.c 2017-11-11 09:05:50.662012999 -0700 -@@ -14,7 +14,7 @@ - #define _CRT_SECURE_NO_WARNINGS - #endif - --#if defined(__APPLE__) || defined(IOAPI_NO_64) -+#if defined(__APPLE__) || defined(IOAPI_NO_64) || defined(__CYGWIN__) - // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions - #define FOPEN_FUNC(filename, mode) fopen(filename, mode) - #define FTELLO_FUNC(stream) ftello(stream) diff --git a/zlib/contrib/minizip/ioapi.h b/zlib/contrib/minizip/ioapi.h index ae9ca7e83..a2d2e6e60 100644 --- a/zlib/contrib/minizip/ioapi.h +++ b/zlib/contrib/minizip/ioapi.h @@ -50,7 +50,7 @@ #define ftello64 ftell #define fseeko64 fseek #else -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) #define fopen64 fopen #define ftello64 ftello #define fseeko64 fseeko @@ -82,7 +82,7 @@ #include "mz64conf.h" #endif -/* a type choosen by DEFINE */ +/* a type chosen by DEFINE */ #ifdef HAVE_64BIT_INT_CUSTOM typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; #else @@ -134,17 +134,17 @@ extern "C" { -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); +typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char* filename, int mode); +typedef uLong (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uLong size); +typedef uLong (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void* buf, uLong size); +typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream); +typedef int (ZCALLBACK *testerror_file_func) (voidpf opaque, voidpf stream); -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream); +typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uLong offset, int origin); -/* here is the "old" 32 bits structure structure */ +/* here is the "old" 32 bits structure */ typedef struct zlib_filefunc_def_s { open_file_func zopen_file; @@ -157,9 +157,9 @@ typedef struct zlib_filefunc_def_s voidpf opaque; } zlib_filefunc_def; -typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream); +typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin); +typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void* filename, int mode); typedef struct zlib_filefunc64_def_s { @@ -173,8 +173,8 @@ typedef struct zlib_filefunc64_def_s voidpf opaque; } zlib_filefunc64_def; -void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def); +void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def); /* now internal definition, only for zip.c and unzip.h */ typedef struct zlib_filefunc64_32_def_s @@ -193,11 +193,11 @@ typedef struct zlib_filefunc64_32_def_s #define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) #define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) -voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); -long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); -ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); +voidpf call_zopen64(const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode); +long call_zseek64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin); +ZPOS64_T call_ztell64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream); -void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); #define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) #define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) diff --git a/zlib/contrib/minizip/iowin32.c b/zlib/contrib/minizip/iowin32.c index 7df525172..08536e94b 100644 --- a/zlib/contrib/minizip/iowin32.c +++ b/zlib/contrib/minizip/iowin32.c @@ -38,14 +38,6 @@ #endif #endif -voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); -uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); -long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); -int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); - typedef struct { HANDLE hf; @@ -57,8 +49,7 @@ static void win32_translate_open_mode(int mode, DWORD* lpdwDesiredAccess, DWORD* lpdwCreationDisposition, DWORD* lpdwShareMode, - DWORD* lpdwFlagsAndAttributes) -{ + DWORD* lpdwFlagsAndAttributes) { *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) @@ -79,8 +70,7 @@ static void win32_translate_open_mode(int mode, } } -static voidpf win32_build_iowin(HANDLE hFile) -{ +static voidpf win32_build_iowin(HANDLE hFile) { voidpf ret=NULL; if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) @@ -98,8 +88,7 @@ static voidpf win32_build_iowin(HANDLE hFile) return ret; } -voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) -{ +voidpf ZCALLBACK win32_open64_file_func(voidpf opaque, const void* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -127,8 +116,7 @@ voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int } -voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) -{ +voidpf ZCALLBACK win32_open64_file_funcA(voidpf opaque, const void* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -151,8 +139,7 @@ voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int } -voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) -{ +voidpf ZCALLBACK win32_open64_file_funcW(voidpf opaque, const void* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -171,8 +158,7 @@ voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int } -voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) -{ +voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -200,8 +186,7 @@ voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mo } -uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) -{ +uLong ZCALLBACK win32_read_file_func(voidpf opaque, voidpf stream, void* buf,uLong size) { uLong ret=0; HANDLE hFile = NULL; if (stream!=NULL) @@ -222,8 +207,7 @@ uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uL } -uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) -{ +uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret=0; HANDLE hFile = NULL; if (stream!=NULL) @@ -243,8 +227,7 @@ uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* b return ret; } -static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) -{ +static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) { #ifdef IOWIN32_USING_WINRT_API return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); #else @@ -263,8 +246,7 @@ static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *n #endif } -long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) -{ +long ZCALLBACK win32_tell_file_func(voidpf opaque, voidpf stream) { long ret=-1; HANDLE hFile = NULL; if (stream!=NULL) @@ -286,8 +268,7 @@ long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) return ret; } -ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) -{ +ZPOS64_T ZCALLBACK win32_tell64_file_func(voidpf opaque, voidpf stream) { ZPOS64_T ret= (ZPOS64_T)-1; HANDLE hFile = NULL; if (stream!=NULL) @@ -311,8 +292,7 @@ ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) } -long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) -{ +long ZCALLBACK win32_seek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) { DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL; @@ -349,8 +329,7 @@ long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,in return ret; } -long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) -{ +long ZCALLBACK win32_seek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) { DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL; long ret=-1; @@ -388,8 +367,7 @@ long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T off return ret; } -int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) -{ +int ZCALLBACK win32_close_file_func(voidpf opaque, voidpf stream) { int ret=-1; if (stream!=NULL) @@ -406,8 +384,7 @@ int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) return ret; } -int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) -{ +int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream) { int ret=-1; if (stream!=NULL) { @@ -416,8 +393,7 @@ int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) return ret; } -void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = win32_open_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; @@ -428,8 +404,7 @@ void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) pzlib_filefunc_def->opaque = NULL; } -void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; @@ -441,8 +416,7 @@ void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) } -void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; @@ -454,8 +428,7 @@ void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) } -void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; diff --git a/zlib/contrib/minizip/iowin32.h b/zlib/contrib/minizip/iowin32.h index 0ca0969a7..a23a65d43 100644 --- a/zlib/contrib/minizip/iowin32.h +++ b/zlib/contrib/minizip/iowin32.h @@ -18,10 +18,10 @@ extern "C" { #endif -void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); -void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); -void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); -void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def); +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def); +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def); +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def); #ifdef __cplusplus } diff --git a/zlib/contrib/minizip/miniunz.c b/zlib/contrib/minizip/miniunz.c index 0dc9b5081..d627c4226 100644 --- a/zlib/contrib/minizip/miniunz.c +++ b/zlib/contrib/minizip/miniunz.c @@ -27,7 +27,7 @@ #endif #endif -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -79,13 +79,9 @@ /* change_file_date : change the date/time of a file filename : the filename of the file where date/time must be modified - dosdate : the new date at the MSDos format (4 bytes) + dosdate : the new date at the MSDOS format (4 bytes) tmu_date : the SAME new date at the tm_unz format */ -static void change_file_date(filename,dosdate,tmu_date) - const char *filename; - uLong dosdate; - tm_unz tmu_date; -{ +static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_date) { #ifdef _WIN32 HANDLE hFile; FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; @@ -115,6 +111,10 @@ static void change_file_date(filename,dosdate,tmu_date) ut.actime=ut.modtime=mktime(&newdate); utime(filename,&ut); +#else + (void)filename; + (void)dosdate; + (void)tmu_date; #endif #endif } @@ -123,9 +123,7 @@ static void change_file_date(filename,dosdate,tmu_date) /* mymkdir and change_file_date are not 100 % portable As I don't know well Unix, I wait feedback for the unix portion */ -static int mymkdir(dirname) - const char* dirname; -{ +static int mymkdir(const char* dirname) { int ret=0; #ifdef _WIN32 ret = _mkdir(dirname); @@ -133,13 +131,13 @@ static int mymkdir(dirname) ret = mkdir (dirname,0775); #elif __APPLE__ ret = mkdir (dirname,0775); +#else + (void)dirname; #endif return ret; } -static int makedir (newdir) - const char *newdir; -{ +static int makedir(const char *newdir) { char *buffer ; char *p; size_t len = strlen(newdir); @@ -187,14 +185,12 @@ static int makedir (newdir) return 1; } -static void do_banner() -{ - printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); +static void do_banner(void) { + printf("MiniUnz 1.1, demo of zLib + Unz package written by Gilles Vollant\n"); printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); } -static void do_help() -{ +static void do_help(void) { printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ " -e Extract without pathname (junk paths)\n" \ " -x Extract with pathname\n" \ @@ -202,11 +198,10 @@ static void do_help() " -l list files\n" \ " -d directory to extract into\n" \ " -o overwrite files without prompting\n" \ - " -p extract crypted file using password\n\n"); + " -p extract encrypted file using password\n\n"); } -static void Display64BitsSize(ZPOS64_T n, int size_char) -{ +static void Display64BitsSize(ZPOS64_T n, int size_char) { /* to avoid compatibility problem , we do here the conversion */ char number[21]; int offset=19; @@ -233,9 +228,7 @@ static void Display64BitsSize(ZPOS64_T n, int size_char) printf("%s",&number[pos_string]); } -static int do_list(uf) - unzFile uf; -{ +static int do_list(unzFile uf) { uLong i; unz_global_info64 gi; int err; @@ -250,7 +243,7 @@ static int do_list(uf) char filename_inzip[256]; unz_file_info64 file_info; uLong ratio=0; - const char *string_method; + const char *string_method = ""; char charCrypt=' '; err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); if (err!=UNZ_OK) @@ -261,7 +254,7 @@ static int do_list(uf) if (file_info.uncompressed_size>0) ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); - /* display a '*' if the file is crypted */ + /* display a '*' if the file is encrypted */ if ((file_info.flag & 1) != 0) charCrypt='*'; @@ -311,12 +304,7 @@ static int do_list(uf) } -static int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) - unzFile uf; - const int* popt_extract_without_path; - int* popt_overwrite; - const char* password; -{ +static int do_extract_currentfile(unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password) { char filename_inzip[256]; char* filename_withoutpath; char* p; @@ -368,6 +356,20 @@ static int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,pa else write_filename = filename_withoutpath; + if (write_filename[0]!='\0') + { + const char* relative_check = write_filename; + while (relative_check[1]!='\0') + { + if (relative_check[0]=='.' && relative_check[1]=='.') + write_filename = relative_check; + relative_check++; + } + } + + while (write_filename[0]=='/' || write_filename[0]=='.') + write_filename++; + err = unzOpenCurrentFilePassword(uf,password); if (err!=UNZ_OK) { @@ -473,12 +475,7 @@ static int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,pa } -static int do_extract(uf,opt_extract_without_path,opt_overwrite,password) - unzFile uf; - int opt_extract_without_path; - int opt_overwrite; - const char* password; -{ +static int do_extract(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password) { uLong i; unz_global_info64 gi; int err; @@ -508,13 +505,7 @@ static int do_extract(uf,opt_extract_without_path,opt_overwrite,password) return 0; } -static int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) - unzFile uf; - const char* filename; - int opt_extract_without_path; - int opt_overwrite; - const char* password; -{ +static int do_extract_onefile(unzFile uf, const char* filename, int opt_extract_without_path, int opt_overwrite, const char* password) { if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) { printf("file %s not found in the zipfile\n",filename); @@ -530,10 +521,7 @@ static int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite } -int main(argc,argv) - int argc; - char *argv[]; -{ +int main(int argc, char *argv[]) { const char *zipfilename=NULL; const char *filename_to_extract=NULL; const char *password=NULL; @@ -606,7 +594,7 @@ int main(argc,argv) # endif strncpy(filename_try, zipfilename,MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ + /* strncpy doesn't append the trailing NULL, of the string is too long. */ filename_try[ MAXFILENAME ] = '\0'; # ifdef USEWIN32IOAPI diff --git a/zlib/contrib/minizip/minizip.c b/zlib/contrib/minizip/minizip.c index e8561b15f..26ee8d029 100644 --- a/zlib/contrib/minizip/minizip.c +++ b/zlib/contrib/minizip/minizip.c @@ -28,7 +28,7 @@ #endif #endif -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -71,11 +71,9 @@ #define MAXFILENAME (256) #ifdef _WIN32 -static int filetime(f, tmzip, dt) - const char *f; /* name of file to get info on */ - tm_zip *tmzip; /* return value: access, modific. and creation times */ - uLong *dt; /* dostime */ -{ +/* f: name of file to get info on, tmzip: return value: access, + modification and creation times, dt: dostime */ +static int filetime(const char *f, tm_zip *tmzip, uLong *dt) { int ret = 0; { FILETIME ftLocal; @@ -95,11 +93,9 @@ static int filetime(f, tmzip, dt) } #else #if defined(unix) || defined(__APPLE__) -static int filetime(f, tmzip, dt) - const char *f; /* name of file to get info on */ - tm_zip *tmzip; /* return value: access, modific. and creation times */ - uLong *dt; /* dostime */ -{ +/* f: name of file to get info on, tmzip: return value: access, + modification and creation times, dt: dostime */ +static int filetime(const char *f, tm_zip *tmzip, uLong *dt) { (void)dt; int ret=0; struct stat s; /* results of stat() */ @@ -114,7 +110,7 @@ static int filetime(f, tmzip, dt) len = MAXFILENAME; strncpy(name, f,MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ + /* strncpy doesn't append the trailing NULL, of the string is too long. */ name[ MAXFILENAME ] = '\0'; if (name[len - 1] == '/') @@ -138,11 +134,12 @@ static int filetime(f, tmzip, dt) return ret; } #else -uLong filetime(f, tmzip, dt) - const char *f; /* name of file to get info on */ - tm_zip *tmzip; /* return value: access, modific. and creation times */ - uLong *dt; /* dostime */ -{ +/* f: name of file to get info on, tmzip: return value: access, + modification and creation times, dt: dostime */ +static int filetime(const char *f, tm_zip *tmzip, uLong *dt) { + (void)f; + (void)tmzip; + (void)dt; return 0; } #endif @@ -151,9 +148,7 @@ uLong filetime(f, tmzip, dt) -static int check_exist_file(filename) - const char* filename; -{ +static int check_exist_file(const char* filename) { FILE* ftestexist; int ret = 1; ftestexist = FOPEN_FUNC(filename,"rb"); @@ -164,14 +159,12 @@ static int check_exist_file(filename) return ret; } -static void do_banner() -{ +static void do_banner(void) { printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); } -static void do_help() -{ +static void do_help(void) { printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ " -o Overwrite existing file.zip\n" \ " -a Append to existing file.zip\n" \ @@ -183,8 +176,7 @@ static void do_help() /* calculate the CRC32 of a file, because to encrypt a file, we need known the CRC32 of the file before */ -static int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) -{ +static int getFileCrc(const char* filenameinzip, void* buf, unsigned long size_buf, unsigned long* result_crc) { unsigned long calculate_crc=0; int err=ZIP_OK; FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); @@ -222,8 +214,7 @@ static int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf, return err; } -static int isLargeFile(const char* filename) -{ +static int isLargeFile(const char* filename) { int largeFile = 0; ZPOS64_T pos = 0; FILE* pFile = FOPEN_FUNC(filename, "rb"); @@ -233,7 +224,7 @@ static int isLargeFile(const char* filename) FSEEKO_FUNC(pFile, 0, SEEK_END); pos = (ZPOS64_T)FTELLO_FUNC(pFile); - printf("File : %s is %lld bytes\n", filename, pos); + printf("File : %s is %llu bytes\n", filename, pos); if(pos >= 0xffffffff) largeFile = 1; @@ -244,10 +235,7 @@ static int isLargeFile(const char* filename) return largeFile; } -int main(argc,argv) - int argc; - char *argv[]; -{ +int main(int argc, char *argv[]) { int i; int opt_overwrite=0; int opt_compress_level=Z_DEFAULT_COMPRESSION; @@ -323,7 +311,7 @@ int main(argc,argv) zipok = 1 ; strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ + /* strncpy doesn't append the trailing NULL, of the string is too long. */ filename_try[ MAXFILENAME ] = '\0'; len=(int)strlen(filename_try); @@ -393,10 +381,10 @@ int main(argc,argv) ((argv[i][1]=='o') || (argv[i][1]=='O') || (argv[i][1]=='a') || (argv[i][1]=='A') || (argv[i][1]=='p') || (argv[i][1]=='P') || - ((argv[i][1]>='0') || (argv[i][1]<='9'))) && + ((argv[i][1]>='0') && (argv[i][1]<='9'))) && (strlen(argv[i]) == 2))) { - FILE * fin; + FILE * fin = NULL; size_t size_read; const char* filenameinzip = argv[i]; const char *savefilenameinzip; diff --git a/zlib/contrib/minizip/mztools.c b/zlib/contrib/minizip/mztools.c index 96891c2e0..c8d237561 100644 --- a/zlib/contrib/minizip/mztools.c +++ b/zlib/contrib/minizip/mztools.c @@ -27,13 +27,7 @@ WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ } while(0) -extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) -const char* file; -const char* fileOut; -const char* fileOutTmp; -uLong* nRecovered; -uLong* bytesRecovered; -{ +extern int ZEXPORT unzRepair(const char* file, const char* fileOut, const char* fileOutTmp, uLong* nRecovered, uLong* bytesRecovered) { int err = Z_OK; FILE* fpZip = fopen(file, "rb"); FILE* fpOut = fopen(fileOut, "wb"); diff --git a/zlib/contrib/minizip/unzip.c b/zlib/contrib/minizip/unzip.c index 3036b470b..ea05b7d62 100644 --- a/zlib/contrib/minizip/unzip.c +++ b/zlib/contrib/minizip/unzip.c @@ -49,12 +49,12 @@ Copyright (C) 2007-2008 Even Rouault - Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G should only read the compressed/uncompressed size from the Zip64 format if the size from normal header was 0xFFFFFFFF - Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant - Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Oct-2009 - Mathias Svensson - Applied some bug fixes from patches received from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression method BZIP2 (bzip2 lib is required) Patch created by Daniel Borca Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer @@ -77,8 +77,6 @@ #ifdef STDC # include -# include -# include #endif #ifdef NO_ERRNO_H extern int errno; @@ -111,9 +109,6 @@ #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif -#ifndef TRYFREE -# define TRYFREE(p) { free(p);} -#endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) @@ -122,7 +117,7 @@ const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; -/* unz_file_info_interntal contain internal info about a file in zipfile*/ +/* unz_file_info64_internal contain internal info about a file in zipfile*/ typedef struct unz_file_info64_internal_s { ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ @@ -153,7 +148,7 @@ typedef struct ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ uLong compression_method; /* compression method (0==store) */ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; @@ -166,7 +161,7 @@ typedef struct { zlib_filefunc64_32_def z_filefunc; int is64bitOpenFunction; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ unz_global_info64 gi; /* public global information */ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ ZPOS64_T num_file; /* number of the current file in the zipfile*/ @@ -197,29 +192,24 @@ typedef struct #include "crypt.h" #endif + /* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been successfully opened for reading. + Reads a long in LSB order from the given gz_stream. Sets */ - -local int unz64local_getByte OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) -{ - unsigned char c; - int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) +local int unz64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) { + unsigned char c[2]; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,2); + if (err==2) { - *pi = (int)c; + *pX = c[0] | ((uLong)c[1] << 8); return UNZ_OK; } else { + *pX = 0; if (ZERROR64(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else @@ -227,127 +217,50 @@ local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, v } } - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unz64local_getShort OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, +local int unz64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - uLong *pX) -{ - uLong x ; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unz64local_getLong OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX) -{ - uLong x ; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; + uLong *pX) { + unsigned char c[4]; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,4); + if (err==4) + { + *pX = c[0] | ((uLong)c[1] << 8) | ((uLong)c[2] << 16) | ((uLong)c[3] << 24); + return UNZ_OK; + } else + { *pX = 0; - return err; + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } } -local int unz64local_getLong64 OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - ZPOS64_T *pX)); - - -local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - ZPOS64_T *pX) -{ - ZPOS64_T x ; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x = (ZPOS64_T)i; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<8; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<16; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<24; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<32; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<40; - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<48; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<56; - - if (err==UNZ_OK) - *pX = x; +local int unz64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) { + unsigned char c[8]; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,8); + if (err==8) + { + *pX = c[0] | ((ZPOS64_T)c[1] << 8) | ((ZPOS64_T)c[2] << 16) | ((ZPOS64_T)c[3] << 24) + | ((ZPOS64_T)c[4] << 32) | ((ZPOS64_T)c[5] << 40) | ((ZPOS64_T)c[6] << 48) | ((ZPOS64_T)c[7] << 56); + return UNZ_OK; + } else + { *pX = 0; - return err; + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } } /* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) -{ +local int strcmpcasenosensitive_internal(const char* fileName1, const char* fileName2) { for (;;) { char c1=*(fileName1++); @@ -379,19 +292,17 @@ local int strcmpcasenosensitive_internal (const char* fileName1, const char* fil #endif /* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + Compare two filenames (fileName1,fileName2). + If iCaseSensitivity = 1, comparison is case sensitive (like strcmp) + If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + If iCaseSensitivity = 0, case sensitivity is default of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, - const char* fileName2, - int iCaseSensitivity) - -{ + const char* fileName2, + int iCaseSensitivity) { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; @@ -405,21 +316,23 @@ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, #define BUFREADCOMMENT (0x400) #endif +#ifndef CENTRALDIRINVALID +#define CENTRALDIRINVALID ((ZPOS64_T)(-1)) +#endif + /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); -local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ - ZPOS64_T uPosFound=0; + ZPOS64_T uPosFound=CENTRALDIRINVALID; if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; + return CENTRALDIRINVALID; uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); @@ -429,7 +342,7 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) - return 0; + return CENTRALDIRINVALID; uBackRead = 4; while (uBackReadz_filefunc, s->filestream); - TRYFREE(s); + free(s); return UNZ_OK; } @@ -825,8 +727,7 @@ extern int ZEXPORT unzClose (unzFile file) Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) -{ +extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64* pglobal_info) { unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; @@ -835,8 +736,7 @@ extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_ return UNZ_OK; } -extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) -{ +extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) { unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; @@ -847,10 +747,9 @@ extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info return UNZ_OK; } /* - Translate date/time from Dos format to tm_unz (readable more easilty) + Translate date/time from Dos format to tm_unz (readable more easily) */ -local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) -{ +local void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz* ptm) { ZPOS64_T uDate; uDate = (ZPOS64_T)(ulDosDate>>16); ptm->tm_mday = (int)(uDate&0x1f) ; @@ -865,28 +764,16 @@ local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) /* Get Info about the current file in the zipfile, with internal only info */ -local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info64 *pfile_info, - unz_file_info64_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unz64local_GetCurrentFileInfoInternal (unzFile file, - unz_file_info64 *pfile_info, - unz_file_info64_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize) -{ +local int unz64local_GetCurrentFileInfoInternal(unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) { unz64_s* s; unz_file_info64 file_info; unz_file_info64_internal file_info_internal; @@ -1038,33 +925,31 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, /* ZIP64 extra fields */ if (headerId == 0x0001) { - uLong uL; - - if(file_info.uncompressed_size == MAXU32) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info.compressed_size == MAXU32) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info_internal.offset_curfile == MAXU32) - { - /* Relative Header offset */ - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info.disk_num_start == MAXU32) - { - /* Disk Start Number */ - if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) - err=UNZ_ERRNO; - } + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == 0xffff) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + } } else @@ -1121,24 +1006,22 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, - unz_file_info64 * pfile_info, - char * szFileName, uLong fileNameBufferSize, - void *extraField, uLong extraFieldBufferSize, - char* szComment, uLong commentBufferSize) -{ +extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) { return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); } -extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, - unz_file_info * pfile_info, - char * szFileName, uLong fileNameBufferSize, - void *extraField, uLong extraFieldBufferSize, - char* szComment, uLong commentBufferSize) -{ +extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) { int err; unz_file_info64 file_info64; err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, @@ -1162,7 +1045,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, pfile_info->internal_fa = file_info64.internal_fa; pfile_info->external_fa = file_info64.external_fa; - pfile_info->tmu_date = file_info64.tmu_date, + pfile_info->tmu_date = file_info64.tmu_date; pfile_info->compressed_size = (uLong)file_info64.compressed_size; @@ -1175,8 +1058,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ -extern int ZEXPORT unzGoToFirstFile (unzFile file) -{ +extern int ZEXPORT unzGoToFirstFile(unzFile file) { int err=UNZ_OK; unz64_s* s; if (file==NULL) @@ -1196,8 +1078,7 @@ extern int ZEXPORT unzGoToFirstFile (unzFile file) return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ -extern int ZEXPORT unzGoToNextFile (unzFile file) -{ +extern int ZEXPORT unzGoToNextFile(unzFile file) { unz64_s* s; int err; @@ -1229,8 +1110,7 @@ extern int ZEXPORT unzGoToNextFile (unzFile file) UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ -extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) -{ +extern int ZEXPORT unzLocateFile(unzFile file, const char *szFileName, int iCaseSensitivity) { unz64_s* s; int err; @@ -1305,8 +1185,7 @@ typedef struct unz_file_pos_s } unz_file_pos; */ -extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) -{ +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) { unz64_s* s; if (file==NULL || file_pos==NULL) @@ -1321,10 +1200,7 @@ extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) return UNZ_OK; } -extern int ZEXPORT unzGetFilePos( - unzFile file, - unz_file_pos* file_pos) -{ +extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) { unz64_file_pos file_pos64; int err = unzGetFilePos64(file,&file_pos64); if (err==UNZ_OK) @@ -1335,8 +1211,7 @@ extern int ZEXPORT unzGetFilePos( return err; } -extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) -{ +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) { unz64_s* s; int err; @@ -1357,10 +1232,7 @@ extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos return err; } -extern int ZEXPORT unzGoToFilePos( - unzFile file, - unz_file_pos* file_pos) -{ +extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos) { unz64_file_pos file_pos64; if (file_pos == NULL) return UNZ_PARAMERROR; @@ -1382,10 +1254,9 @@ extern int ZEXPORT unzGoToFilePos( store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ -local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, - ZPOS64_T * poffset_local_extrafield, - uInt * psize_local_extrafield) -{ +local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; @@ -1469,9 +1340,8 @@ local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVa Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, - int* level, int raw, const char* password) -{ +extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method, + int* level, int raw, const char* password) { int err=UNZ_OK; uInt iSizeVar; unz64_s* s; @@ -1509,7 +1379,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, if (pfile_in_zip_read_info->read_buffer==NULL) { - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } @@ -1566,8 +1436,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; else { - TRYFREE(pfile_in_zip_read_info->read_buffer); - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info->read_buffer); + free(pfile_in_zip_read_info); return err; } #else @@ -1587,8 +1457,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; else { - TRYFREE(pfile_in_zip_read_info->read_buffer); - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info->read_buffer); + free(pfile_in_zip_read_info); return err; } /* windowBits is passed < 0 to tell that there is no zlib header. @@ -1640,25 +1510,21 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, return UNZ_OK; } -extern int ZEXPORT unzOpenCurrentFile (unzFile file) -{ +extern int ZEXPORT unzOpenCurrentFile(unzFile file) { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } -extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) -{ +extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char* password) { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } -extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) -{ +extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int* method, int* level, int raw) { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /** Addition for GDAL : START */ -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) -{ +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; s=(unz64_s*)file; @@ -1678,13 +1544,12 @@ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) buf contain buffer where data must be copied len the size of buf. - return the number of byte copied if somes bytes are copied + return the number of byte copied if some bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) -{ +extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len) { int err=UNZ_OK; uInt iRead = 0; unz64_s* s; @@ -1891,8 +1756,7 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) /* Give the current position in uncompressed data */ -extern z_off_t ZEXPORT unztell (unzFile file) -{ +extern z_off_t ZEXPORT unztell(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) @@ -1906,8 +1770,7 @@ extern z_off_t ZEXPORT unztell (unzFile file) return (z_off_t)pfile_in_zip_read_info->stream.total_out; } -extern ZPOS64_T ZEXPORT unztell64 (unzFile file) -{ +extern ZPOS64_T ZEXPORT unztell64(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; @@ -1926,8 +1789,7 @@ extern ZPOS64_T ZEXPORT unztell64 (unzFile file) /* return 1 if the end of file was reached, 0 elsewhere */ -extern int ZEXPORT unzeof (unzFile file) -{ +extern int ZEXPORT unzeof(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) @@ -1958,8 +1820,7 @@ more info in the local-header version than in the central-header) the return value is the number of bytes copied in buf, or (if <0) the error code */ -extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) -{ +extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; uInt read_now; @@ -2006,8 +1867,7 @@ extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ -extern int ZEXPORT unzCloseCurrentFile (unzFile file) -{ +extern int ZEXPORT unzCloseCurrentFile(unzFile file) { int err=UNZ_OK; unz64_s* s; @@ -2029,7 +1889,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file) } - TRYFREE(pfile_in_zip_read_info->read_buffer); + free(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) inflateEnd(&pfile_in_zip_read_info->stream); @@ -2040,7 +1900,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file) pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; @@ -2053,8 +1913,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file) uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ -extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) -{ +extern int ZEXPORT unzGetGlobalComment(unzFile file, char * szComment, uLong uSizeBuf) { unz64_s* s; uLong uReadThis ; if (file==NULL) @@ -2081,8 +1940,7 @@ extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uS } /* Additions by RX '2004 */ -extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) -{ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) { unz64_s* s; if (file==NULL) @@ -2096,8 +1954,7 @@ extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) return s->pos_in_central_dir; } -extern uLong ZEXPORT unzGetOffset (unzFile file) -{ +extern uLong ZEXPORT unzGetOffset(unzFile file) { ZPOS64_T offset64; if (file==NULL) @@ -2106,8 +1963,7 @@ extern uLong ZEXPORT unzGetOffset (unzFile file) return (uLong)offset64; } -extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) -{ +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) { unz64_s* s; int err; @@ -2124,7 +1980,6 @@ extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) return err; } -extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) -{ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) { return unzSetOffset64(file,pos); } diff --git a/zlib/contrib/minizip/unzip.h b/zlib/contrib/minizip/unzip.h index 6f95e94d7..5cfc9c627 100644 --- a/zlib/contrib/minizip/unzip.h +++ b/zlib/contrib/minizip/unzip.h @@ -150,21 +150,21 @@ typedef struct unz_file_info_s tm_unz tmu_date; } unz_file_info; -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); +extern int ZEXPORT unzStringFileNameCompare(const char* fileName1, + const char* fileName2, + int iCaseSensitivity); /* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + Compare two filenames (fileName1,fileName2). + If iCaseSensitivity = 1, comparison is case sensitive (like strcmp) + If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + If iCaseSensitivity = 0, case sensitivity is default of your operating system (like 1 on Unix, 2 on Windows) */ -extern unzFile ZEXPORT unzOpen OF((const char *path)); -extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +extern unzFile ZEXPORT unzOpen(const char *path); +extern unzFile ZEXPORT unzOpen64(const void *path); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer @@ -181,41 +181,41 @@ extern unzFile ZEXPORT unzOpen64 OF((const void *path)); */ -extern unzFile ZEXPORT unzOpen2 OF((const char *path, - zlib_filefunc_def* pzlib_filefunc_def)); +extern unzFile ZEXPORT unzOpen2(const char *path, + zlib_filefunc_def* pzlib_filefunc_def); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ -extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, - zlib_filefunc64_def* pzlib_filefunc_def)); +extern unzFile ZEXPORT unzOpen2_64(const void *path, + zlib_filefunc64_def* pzlib_filefunc_def); /* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ -extern int ZEXPORT unzClose OF((unzFile file)); +extern int ZEXPORT unzClose(unzFile file); /* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzCloseCurrentFile before call unzClose. return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); +extern int ZEXPORT unzGetGlobalInfo(unzFile file, + unz_global_info *pglobal_info); -extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, - unz_global_info64 *pglobal_info)); +extern int ZEXPORT unzGetGlobalInfo64(unzFile file, + unz_global_info64 *pglobal_info); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); +extern int ZEXPORT unzGetGlobalComment(unzFile file, + char *szComment, + uLong uSizeBuf); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. @@ -226,22 +226,22 @@ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +extern int ZEXPORT unzGoToFirstFile(unzFile file); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +extern int ZEXPORT unzGoToNextFile(unzFile file); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); +extern int ZEXPORT unzLocateFile(unzFile file, + const char *szFileName, + int iCaseSensitivity); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare @@ -285,28 +285,28 @@ extern int ZEXPORT unzGoToFilePos64( /* ****************************************** */ -extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, - unz_file_info64 *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); +extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize); + +extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize); /* Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about + if pfile_info!=NULL, the *pfile_info structure will contain some info about the current file - if szFileName!=NULL, the filemane string will be copied in szFileName + if szFileName!=NULL, the filename string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). @@ -318,7 +318,7 @@ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, /** Addition for GDAL : START */ -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file); /** Addition for GDAL : END */ @@ -328,24 +328,24 @@ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); from it, and close it (you can close it before reading all the file) */ -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +extern int ZEXPORT unzOpenCurrentFile(unzFile file); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, - const char* password)); +extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, + const char* password); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, - int* method, - int* level, - int raw)); +extern int ZEXPORT unzOpenCurrentFile2(unzFile file, + int* method, + int* level, + int raw); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 @@ -355,11 +355,11 @@ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, but you CANNOT set method parameter as NULL */ -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, - int* method, - int* level, - int raw, - const char* password)); +extern int ZEXPORT unzOpenCurrentFile3(unzFile file, + int* method, + int* level, + int raw, + const char* password); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 @@ -370,41 +370,41 @@ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, */ -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +extern int ZEXPORT unzCloseCurrentFile(unzFile file); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); +extern int ZEXPORT unzReadCurrentFile(unzFile file, + voidp buf, + unsigned len); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. - return the number of byte copied if somes bytes are copied + return the number of byte copied if some bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern z_off_t ZEXPORT unztell OF((unzFile file)); +extern z_off_t ZEXPORT unztell(unzFile file); -extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +extern ZPOS64_T ZEXPORT unztell64(unzFile file); /* Give the current position in uncompressed data */ -extern int ZEXPORT unzeof OF((unzFile file)); +extern int ZEXPORT unzeof(unzFile file); /* return 1 if the end of file was reached, 0 elsewhere */ -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); +extern int ZEXPORT unzGetLocalExtrafield(unzFile file, + voidp buf, + unsigned len); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is diff --git a/zlib/contrib/minizip/zip.c b/zlib/contrib/minizip/zip.c index 66d693f85..60bdffac3 100644 --- a/zlib/contrib/minizip/zip.c +++ b/zlib/contrib/minizip/zip.c @@ -14,7 +14,7 @@ Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data - It is used when recreting zip archive with RAW when deleting items from a zip. + It is used when recreating zip archive with RAW when deleting items from a zip. ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer @@ -25,14 +25,13 @@ #include #include #include +#include #include #include "zlib.h" #include "zip.h" #ifdef STDC # include -# include -# include #endif #ifdef NO_ERRNO_H extern int errno; @@ -47,7 +46,7 @@ /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef VERSIONMADEBY -# define VERSIONMADEBY (0x0) /* platform depedent */ +# define VERSIONMADEBY (0x0) /* platform dependent */ #endif #ifndef Z_BUFSIZE @@ -61,9 +60,6 @@ #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif /* #define SIZECENTRALDIRITEM (0x2e) @@ -138,20 +134,20 @@ typedef struct uInt pos_in_buffered_data; /* last written byte in buffered_data */ ZPOS64_T pos_local_header; /* offset of the local header of the file - currenty writing */ + currently writing */ char* central_header; /* central header data for the current file */ uLong size_centralExtra; uLong size_centralheader; /* size of the central header for cur file */ uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ uLong flag; /* flag of the file currently writing */ - int method; /* compression method of file currenty wr.*/ + int method; /* compression method of file currently wr.*/ int raw; /* 1 for directly writing raw data */ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ uLong dosDate; uLong crc32; int encrypt; - int zip64; /* Add ZIP64 extened information in the extra field */ + int zip64; /* Add ZIP64 extended information in the extra field */ ZPOS64_T pos_zip64extrainfo; ZPOS64_T totalCompressedData; ZPOS64_T totalUncompressedData; @@ -165,10 +161,10 @@ typedef struct typedef struct { zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ linkedlist_data central_dir;/* datablock with central dir in construction*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - curfile64_info ci; /* info on the file curretly writing */ + curfile64_info ci; /* info on the file currently writing */ ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ ZPOS64_T add_position_when_writing_offset; @@ -186,8 +182,7 @@ typedef struct #include "crypt.h" #endif -local linkedlist_datablock_internal* allocate_new_datablock() -{ +local linkedlist_datablock_internal* allocate_new_datablock(void) { linkedlist_datablock_internal* ldi; ldi = (linkedlist_datablock_internal*) ALLOC(sizeof(linkedlist_datablock_internal)); @@ -200,30 +195,26 @@ local linkedlist_datablock_internal* allocate_new_datablock() return ldi; } -local void free_datablock(linkedlist_datablock_internal* ldi) -{ +local void free_datablock(linkedlist_datablock_internal* ldi) { while (ldi!=NULL) { linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE(ldi); + free(ldi); ldi = ldinext; } } -local void init_linkedlist(linkedlist_data* ll) -{ +local void init_linkedlist(linkedlist_data* ll) { ll->first_block = ll->last_block = NULL; } -local void free_linkedlist(linkedlist_data* ll) -{ +local void free_linkedlist(linkedlist_data* ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } -local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) -{ +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) { linkedlist_datablock_internal* ldi; const unsigned char* from_copy; @@ -238,7 +229,7 @@ local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) } ldi = ll->last_block; - from_copy = (unsigned char*)buf; + from_copy = (const unsigned char*)buf; while (len>0) { @@ -283,9 +274,7 @@ local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */ -local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); -local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) -{ +local int zip64local_putValue(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) { unsigned char buf[8]; int n; for (n = 0; n < nbByte; n++) @@ -307,9 +296,7 @@ local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, return ZIP_OK; } -local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); -local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) -{ +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) { unsigned char* buf=(unsigned char*)dest; int n; for (n = 0; n < nbByte; n++) { @@ -329,8 +316,7 @@ local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) /****************************************************************************/ -local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) -{ +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) { uLong year = (uLong)ptm->tm_year; if (year>=1980) year-=1980; @@ -344,10 +330,7 @@ local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) /****************************************************************************/ -local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); - -local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) -{ +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int* pi) { unsigned char c; int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); if (err==1) @@ -368,10 +351,7 @@ local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,vo /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ -local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); - -local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ +local int zip64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) { uLong x ; int i = 0; int err; @@ -390,10 +370,7 @@ local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, return err; } -local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); - -local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ +local int zip64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) { uLong x ; int i = 0; int err; @@ -420,11 +397,8 @@ local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, return err; } -local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); - -local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) -{ +local int zip64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) { ZPOS64_T x; int i = 0; int err; @@ -475,10 +449,7 @@ local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def Locate the Central directory of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); - -local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; @@ -529,7 +500,7 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f if (uPosFound!=0) break; } - TRYFREE(buf); + free(buf); return uPosFound; } @@ -537,10 +508,7 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); - -local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; @@ -595,7 +563,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib break; } - TRYFREE(buf); + free(buf); if (uPosFound == 0) return 0; @@ -607,7 +575,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; - /* number of the disk with the start of the zip64 end of central directory */ + /* number of the disk with the start of the zip64 end of central directory */ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; if (uL != 0) @@ -637,8 +605,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib return relativeOffset; } -local int LoadCentralDirectoryRecord(zip64_internal* pziinit) -{ +local int LoadCentralDirectoryRecord(zip64_internal* pziinit) { int err=ZIP_OK; ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ @@ -647,10 +614,10 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit) ZPOS64_T central_pos; uLong uL; - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ + uLong number_disk; /* number of the current disk, used for + spanning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number of the disk with central dir, used + for spanning ZIP, unsupported, always 0*/ ZPOS64_T number_entry; ZPOS64_T number_entry_CD; /* total number of entries in the central dir @@ -830,7 +797,7 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit) size_central_dir_to_read-=read_this; } - TRYFREE(buf_read); + free(buf_read); } pziinit->begin_pos = byte_before_the_zipfile; pziinit->number_entry = number_entry_CD; @@ -846,8 +813,7 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit) /************************************************************/ -extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) -{ +extern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) { zip64_internal ziinit; zip64_internal* zi; int err=ZIP_OK; @@ -905,9 +871,9 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl if (err != ZIP_OK) { # ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(ziinit.globalcomment); + free(ziinit.globalcomment); # endif /* !NO_ADDFILEINEXISTINGZIP*/ - TRYFREE(zi); + free(zi); return NULL; } else @@ -917,8 +883,7 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl } } -extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) -{ +extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) { if (pzlib_filefunc32_def != NULL) { zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; @@ -929,8 +894,7 @@ extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* gl return zipOpen3(pathname, append, globalcomment, NULL); } -extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) -{ +extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) { if (pzlib_filefunc_def != NULL) { zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; @@ -945,18 +909,15 @@ extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* -extern zipFile ZEXPORT zipOpen (const char* pathname, int append) -{ +extern zipFile ZEXPORT zipOpen(const char* pathname, int append) { return zipOpen3((const void*)pathname,append,NULL,NULL); } -extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) -{ +extern zipFile ZEXPORT zipOpen64(const void* pathname, int append) { return zipOpen3(pathname,append,NULL,NULL); } -local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) -{ +local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) { /* write the local header */ int err; uInt size_filename = (uInt)strlen(filename); @@ -1052,14 +1013,13 @@ local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt s It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize unnecessary allocations. */ -extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, - uLong versionMadeBy, uLong flagBase, int zip64) -{ +extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) { zip64_internal* zi; uInt size_filename; uInt size_comment; @@ -1083,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, return ZIP_PARAMERROR; #endif + // The filename and comment length must fit in 16 bits. + if ((filename!=NULL) && (strlen(filename)>0xffff)) + return ZIP_PARAMERROR; + if ((comment!=NULL) && (strlen(comment)>0xffff)) + return ZIP_PARAMERROR; + // The extra field length must fit in 16 bits. If the member also requires + // a Zip64 extra block, that will also need to fit within that 16-bit + // length, but that will be checked for later. + if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; if (zi->in_opened_file_inzip == 1) @@ -1262,35 +1233,33 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, return err; } -extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, - uLong versionMadeBy, uLong flagBase) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, versionMadeBy, flagBase, 0); +extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); } -extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, 0); +extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); } extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, @@ -1298,70 +1267,64 @@ extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, c const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, zip64); + const char* password, uLong crcForCrypting, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); } extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, 0); + const char* comment, int method, int level, int raw) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); } extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, zip64); + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); } -extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void*extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, zip64); +extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); } -extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void*extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, 0); +extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); } -local int zip64FlushWriteBuffer(zip64_internal* zi) -{ +local int zip64FlushWriteBuffer(zip64_internal* zi) { int err=ZIP_OK; if (zi->ci.encrypt != 0) @@ -1399,8 +1362,7 @@ local int zip64FlushWriteBuffer(zip64_internal* zi) return err; } -extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) -{ +extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void* buf, unsigned int len) { zip64_internal* zi; int err=ZIP_OK; @@ -1450,7 +1412,7 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in else #endif { - zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf; zi->ci.stream.avail_in = len; while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) @@ -1501,13 +1463,11 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in return err; } -extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) -{ +extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32) { return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); } -extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) -{ +extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32) { zip64_internal* zi; ZPOS64_T compressed_size; uLong invalidValue = 0xffffffff; @@ -1648,7 +1608,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) { - // we can not write more data to the buffer that we have room for. + // we cannot write more data to the buffer that we have room for. return ZIP_BADZIPFILE; } @@ -1742,13 +1702,11 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s return err; } -extern int ZEXPORT zipCloseFileInZip (zipFile file) -{ +extern int ZEXPORT zipCloseFileInZip(zipFile file) { return zipCloseFileInZipRaw (file,0,0); } -local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) -{ +local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) { int err = ZIP_OK; ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; @@ -1769,8 +1727,7 @@ local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T z return err; } -local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) -{ +local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; uLong Zip64DataSize = 44; @@ -1808,8 +1765,8 @@ local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_ } return err; } -local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) -{ + +local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; /*signature*/ @@ -1856,8 +1813,7 @@ local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centr return err; } -local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) -{ +local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) { int err = ZIP_OK; uInt size_global_comment = 0; @@ -1874,8 +1830,7 @@ local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) return err; } -extern int ZEXPORT zipClose (zipFile file, const char* global_comment) -{ +extern int ZEXPORT zipClose(zipFile file, const char* global_comment) { zip64_internal* zi; int err = 0; uLong size_centraldir = 0; @@ -1917,7 +1872,7 @@ extern int ZEXPORT zipClose (zipFile file, const char* global_comment) free_linkedlist(&(zi->central_dir)); pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; - if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF) { ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); @@ -1936,15 +1891,14 @@ extern int ZEXPORT zipClose (zipFile file, const char* global_comment) err = ZIP_ERRNO; #ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(zi->globalcomment); + free(zi->globalcomment); #endif - TRYFREE(zi); + free(zi); return err; } -extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) -{ +extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader) { char* p = pData; int size = 0; char* pNewHeader; @@ -1996,7 +1950,7 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe else retVal = ZIP_ERRNO; - TRYFREE(pNewHeader); + free(pNewHeader); return retVal; } diff --git a/zlib/contrib/minizip/zip.h b/zlib/contrib/minizip/zip.h index 7e4509d77..3e230d340 100644 --- a/zlib/contrib/minizip/zip.h +++ b/zlib/contrib/minizip/zip.h @@ -113,8 +113,8 @@ typedef const char* zipcharpc; #define APPEND_STATUS_CREATEAFTER (1) #define APPEND_STATUS_ADDINZIP (2) -extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); -extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +extern zipFile ZEXPORT zipOpen(const char *pathname, int append); +extern zipFile ZEXPORT zipOpen64(const void *pathname, int append); /* Create a zipfile. pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on @@ -131,55 +131,55 @@ extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); /* Note : there is no delete function into a zipfile. If you want delete file into a zipfile, you must open a zipfile, and create another - Of couse, you can use RAW reading and writing to copy the file you did not want delte + Of course, you can use RAW reading and writing to copy the file you did not want delete */ -extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, - int append, - zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc_def)); +extern zipFile ZEXPORT zipOpen2(const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def); -extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, +extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc64_def* pzlib_filefunc_def)); - -extern zipFile ZEXPORT zipOpen3 OF((const void *pathname, - int append, - zipcharpc* globalcomment, - zlib_filefunc64_32_def* pzlib_filefunc64_32_def)); - -extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level)); - -extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int zip64)); + zlib_filefunc64_def* pzlib_filefunc_def); + +extern zipFile ZEXPORT zipOpen3(const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def); + +extern int ZEXPORT zipOpenNewFileInZip(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level); + +extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64); /* Open a file in the ZIP for writing. filename : the filename in zip (if NULL, '-' without quote will be used *zipfi contain supplemental information if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header + contains the extrafield data for the local header if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header + contains the extrafield data for the global header if comment != NULL, comment contain the comment string method contain the compression method (0 for store, Z_DEFLATED for deflate) level contain the level of compression (can be Z_DEFAULT_COMPRESSION) @@ -189,70 +189,69 @@ extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, */ -extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw)); - - -extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int zip64)); +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw); + + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64); /* Same than zipOpenNewFileInZip, except if raw=1, we write raw file */ -extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting)); - -extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - int zip64 - )); +extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting); + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64); /* Same than zipOpenNewFileInZip2, except @@ -261,47 +260,45 @@ extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, crcForCrypting : crc of file to compress (needed for crypting) */ -extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - uLong versionMadeBy, - uLong flagBase - )); - - -extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - uLong versionMadeBy, - uLong flagBase, - int zip64 - )); +extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase); + + +extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64); /* Same than zipOpenNewFileInZip4, except versionMadeBy : value for Version made by field @@ -309,25 +306,25 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, */ -extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, - const void* buf, - unsigned len)); +extern int ZEXPORT zipWriteInFileInZip(zipFile file, + const void* buf, + unsigned len); /* Write data in the zipfile */ -extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +extern int ZEXPORT zipCloseFileInZip(zipFile file); /* Close the current file in the zipfile */ -extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, - uLong uncompressed_size, - uLong crc32)); +extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, + uLong uncompressed_size, + uLong crc32); -extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, - ZPOS64_T uncompressed_size, - uLong crc32)); +extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32); /* Close the current file in the zipfile, for file opened with @@ -335,14 +332,14 @@ extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, uncompressed_size and crc32 are value for the uncompressed size */ -extern int ZEXPORT zipClose OF((zipFile file, - const char* global_comment)); +extern int ZEXPORT zipClose(zipFile file, + const char* global_comment); /* Close the zipfile */ -extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader); /* zipRemoveExtraInfoBlock - Added by Mathias Svensson diff --git a/zlib/crc32.c b/zlib/crc32.c index f8357b083..6c38f5c04 100644 --- a/zlib/crc32.c +++ b/zlib/crc32.c @@ -103,19 +103,6 @@ # define ARMCRC32 #endif -/* Local functions. */ -local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); -local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); - -#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) - local z_word_t byte_swap OF((z_word_t word)); -#endif - -#if defined(W) && !defined(ARMCRC32) - local z_crc_t crc_word OF((z_word_t data)); - local z_word_t crc_word_big OF((z_word_t data)); -#endif - #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) /* Swap the bytes in a z_word_t to convert between little and big endian. Any @@ -123,9 +110,7 @@ local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); instruction, if one is available. This assumes that word_t is either 32 bits or 64 bits. */ -local z_word_t byte_swap(word) - z_word_t word; -{ +local z_word_t byte_swap(z_word_t word) { # if W == 8 return (word & 0xff00000000000000) >> 56 | @@ -146,24 +131,77 @@ local z_word_t byte_swap(word) } #endif +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Table of powers of x for combining CRC-32s, filled in by make_crc_table() + * below. + */ + local z_crc_t FAR x2n_table[32]; +#else +/* ========================================================================= + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). + */ +# include "crc32.h" +#endif + /* CRC polynomial. */ #define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ -#ifdef DYNAMIC_CRC_TABLE +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp(z_crc_t a, z_crc_t b) { + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp(z_off64_t n, unsigned k) { + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Build the tables for byte-wise and braided CRC-32 calculations, and a table + * of powers of x for combining CRC-32s. + */ local z_crc_t FAR crc_table[256]; -local z_crc_t FAR x2n_table[32]; -local void make_crc_table OF((void)); #ifdef W local z_word_t FAR crc_big_table[256]; local z_crc_t FAR crc_braid_table[W][256]; local z_word_t FAR crc_braid_big_table[W][256]; - local void braid OF((z_crc_t [][256], z_word_t [][256], int, int)); + local void braid(z_crc_t [][256], z_word_t [][256], int, int); #endif #ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *, int)); - local void write_table32hi OF((FILE *, const z_word_t FAR *, int)); - local void write_table64 OF((FILE *, const z_word_t FAR *, int)); + local void write_table(FILE *, const z_crc_t FAR *, int); + local void write_table32hi(FILE *, const z_word_t FAR *, int); + local void write_table64(FILE *, const z_word_t FAR *, int); #endif /* MAKECRCH */ /* @@ -176,7 +214,6 @@ local void make_crc_table OF((void)); /* Definition of once functionality. */ typedef struct once_s once_t; -local void once OF((once_t *, void (*)(void))); /* Check for the availability of atomics. */ #if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ @@ -196,10 +233,7 @@ struct once_s { invoke once() at the same time. The state must be a once_t initialized with ONCE_INIT. */ -local void once(state, init) - once_t *state; - void (*init)(void); -{ +local void once(once_t *state, void (*init)(void)) { if (!atomic_load(&state->done)) { if (atomic_flag_test_and_set(&state->begun)) while (!atomic_load(&state->done)) @@ -222,10 +256,7 @@ struct once_s { /* Test and set. Alas, not atomic, but tries to minimize the period of vulnerability. */ -local int test_and_set OF((int volatile *)); -local int test_and_set(flag) - int volatile *flag; -{ +local int test_and_set(int volatile *flag) { int was; was = *flag; @@ -234,10 +265,7 @@ local int test_and_set(flag) } /* Run the provided init() function once. This is not thread-safe. */ -local void once(state, init) - once_t *state; - void (*init)(void); -{ +local void once(once_t *state, void (*init)(void)) { if (!state->done) { if (test_and_set(&state->begun)) while (!state->done) @@ -279,8 +307,7 @@ local once_t made = ONCE_INIT; combinations of CRC register values and incoming bytes. */ -local void make_crc_table() -{ +local void make_crc_table(void) { unsigned i, j, n; z_crc_t p; @@ -447,11 +474,7 @@ local void make_crc_table() Write the 32-bit values in table[0..k-1] to out, five per line in hexadecimal separated by commas. */ -local void write_table(out, table, k) - FILE *out; - const z_crc_t FAR *table; - int k; -{ +local void write_table(FILE *out, const z_crc_t FAR *table, int k) { int n; for (n = 0; n < k; n++) @@ -464,11 +487,7 @@ local void write_table(out, table, k) Write the high 32-bits of each value in table[0..k-1] to out, five per line in hexadecimal separated by commas. */ -local void write_table32hi(out, table, k) -FILE *out; -const z_word_t FAR *table; -int k; -{ +local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) { int n; for (n = 0; n < k; n++) @@ -484,11 +503,7 @@ int k; bits. If not, then the type cast and format string can be adjusted accordingly. */ -local void write_table64(out, table, k) - FILE *out; - const z_word_t FAR *table; - int k; -{ +local void write_table64(FILE *out, const z_word_t FAR *table, int k) { int n; for (n = 0; n < k; n++) @@ -498,8 +513,7 @@ local void write_table64(out, table, k) } /* Actually do the deed. */ -int main() -{ +int main(void) { make_crc_table(); return 0; } @@ -511,12 +525,7 @@ int main() Generate the little and big-endian braid tables for the given n and z_word_t size w. Each array must have room for w blocks of 256 elements. */ -local void braid(ltl, big, n, w) - z_crc_t ltl[][256]; - z_word_t big[][256]; - int n; - int w; -{ +local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) { int k; z_crc_t i, p, q; for (k = 0; k < w; k++) { @@ -531,69 +540,13 @@ local void braid(ltl, big, n, w) } #endif -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables for byte-wise and braided CRC-32 calculations, and a table of powers - * of x for combining CRC-32s, all made by make_crc_table(). - */ -#include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Routines used for CRC calculation. Some are also required for the table - * generation above. - */ - -/* - Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, - reflected. For speed, this requires that a not be zero. - */ -local z_crc_t multmodp(a, b) - z_crc_t a; - z_crc_t b; -{ - z_crc_t m, p; - - m = (z_crc_t)1 << 31; - p = 0; - for (;;) { - if (a & m) { - p ^= b; - if ((a & (m - 1)) == 0) - break; - } - m >>= 1; - b = b & 1 ? (b >> 1) ^ POLY : b >> 1; - } - return p; -} - -/* - Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been - initialized. - */ -local z_crc_t x2nmodp(n, k) - z_off64_t n; - unsigned k; -{ - z_crc_t p; - - p = (z_crc_t)1 << 31; /* x^0 == 1 */ - while (n) { - if (n & 1) - p = multmodp(x2n_table[k & 31], p); - n >>= 1; - k++; - } - return p; -} - /* ========================================================================= * This function can be used by asm versions of crc32(), and to force the * generation of the CRC tables in a threaded application. */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ +const z_crc_t FAR * ZEXPORT get_crc_table(void) { #ifdef DYNAMIC_CRC_TABLE once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ @@ -619,11 +572,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table() #define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ #define Z_BATCH_MIN 800 /* fewest words in a final batch */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { z_crc_t val; z_word_t crc1, crc2; const z_word_t *word; @@ -723,18 +673,14 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) least-significant byte of the word as the first byte of data, without any pre or post conditioning. This is used to combine the CRCs of each braid. */ -local z_crc_t crc_word(data) - z_word_t data; -{ +local z_crc_t crc_word(z_word_t data) { int k; for (k = 0; k < W; k++) data = (data >> 8) ^ crc_table[data & 0xff]; return (z_crc_t)data; } -local z_word_t crc_word_big(data) - z_word_t data; -{ +local z_word_t crc_word_big(z_word_t data) { int k; for (k = 0; k < W; k++) data = (data << 8) ^ @@ -745,11 +691,8 @@ local z_word_t crc_word_big(data) #endif /* ========================================================================= */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { /* Return initial CRC, if requested. */ if (buf == Z_NULL) return 0; @@ -781,8 +724,8 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) words = (z_word_t const *)buf; /* Do endian check at execution time instead of compile time, since ARM - processors can change the endianess at execution time. If the - compiler knows what the endianess will be, it can optimize out the + processors can change the endianness at execution time. If the + compiler knows what the endianness will be, it can optimize out the check and the unused branch. */ endian = 1; if (*(unsigned char *)&endian) { @@ -1069,20 +1012,13 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) #endif /* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ +unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, + uInt len) { return crc32_z(crc, buf, len); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ +uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) { #ifdef DYNAMIC_CRC_TABLE once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ @@ -1090,18 +1026,12 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ +uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) { return crc32_combine64(crc1, crc2, (z_off64_t)len2); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine_gen64(len2) - z_off64_t len2; -{ +uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) { #ifdef DYNAMIC_CRC_TABLE once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ @@ -1109,17 +1039,11 @@ uLong ZEXPORT crc32_combine_gen64(len2) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine_gen(len2) - z_off_t len2; -{ +uLong ZEXPORT crc32_combine_gen(z_off_t len2) { return crc32_combine_gen64((z_off64_t)len2); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine_op(crc1, crc2, op) - uLong crc1; - uLong crc2; - uLong op; -{ +uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) { return multmodp(op, crc1) ^ (crc2 & 0xffffffff); } diff --git a/zlib/deflate.c b/zlib/deflate.c index 4a689db35..012ea8148 100644 --- a/zlib/deflate.c +++ b/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; + " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -60,9 +60,6 @@ const char deflate_copyright[] = copyright string in the executable of your product. */ -/* =========================================================================== - * Function prototypes. - */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ @@ -70,29 +67,16 @@ typedef enum { finish_done /* finish done, accept no more input or output */ } block_state; -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +typedef block_state (*compress_func)(deflate_state *s, int flush); /* Compression function. Returns the block state after the call. */ -local int deflateStateCheck OF((z_streamp strm)); -local void slide_hash OF((deflate_state *s)); -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); +local block_state deflate_stored(deflate_state *s, int flush); +local block_state deflate_fast(deflate_state *s, int flush); #ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -local uInt longest_match OF((deflate_state *s, IPos cur_match)); - -#ifdef ZLIB_DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); +local block_state deflate_slow(deflate_state *s, int flush); #endif +local block_state deflate_rle(deflate_state *s, int flush); +local block_state deflate_huff(deflate_state *s, int flush); /* =========================================================================== * Local data @@ -195,9 +179,12 @@ local const config configuration_table[10] = { * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ -local void slide_hash(s) - deflate_state *s; -{ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) + __attribute__((no_sanitize("memory"))) +# endif +#endif +local void slide_hash(deflate_state *s) { unsigned n, m; Posf *p; uInt wsize = s->w_size; @@ -221,30 +208,177 @@ local void slide_hash(s) #endif } +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) { + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(deflate_state *s) { + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize + MAX_DIST(s)) { + + zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + if (s->insert > s->strstart) + s->insert = s->strstart; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + /* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, + int stream_size) { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, int strategy, + const char *version, int stream_size) { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; @@ -359,7 +493,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, * symbols from which it is being constructed. */ - s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS); s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || @@ -369,8 +503,14 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } +#ifdef LIT_MEM + s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); + s->l_buf = s->pending_buf + (s->lit_bufsize << 2); + s->sym_end = s->lit_bufsize - 1; +#else s->sym_buf = s->pending_buf + s->lit_bufsize; s->sym_end = (s->lit_bufsize - 1) * 3; +#endif /* We avoid equality with lit_bufsize*3 because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. @@ -386,9 +526,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, /* ========================================================================= * Check for a valid deflate stream state. Return 0 if ok, 1 if not. */ -local int deflateStateCheck(strm) - z_streamp strm; -{ +local int deflateStateCheck(z_streamp strm) { deflate_state *s; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -409,11 +547,8 @@ local int deflateStateCheck(strm) } /* ========================================================================= */ -int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ +int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { deflate_state *s; uInt str, n; int wrap; @@ -478,11 +613,8 @@ int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) - z_streamp strm; - Bytef *dictionary; - uInt *dictLength; -{ +int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { deflate_state *s; uInt len; @@ -500,9 +632,7 @@ int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateResetKeep(strm) - z_streamp strm; -{ +int ZEXPORT deflateResetKeep(z_streamp strm) { deflate_state *s; if (deflateStateCheck(strm)) { @@ -537,10 +667,32 @@ int ZEXPORT deflateResetKeep(strm) return Z_OK; } +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init(deflate_state *s) { + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +} + /* ========================================================================= */ -int ZEXPORT deflateReset(strm) - z_streamp strm; -{ +int ZEXPORT deflateReset(z_streamp strm) { int ret; ret = deflateResetKeep(strm); @@ -550,10 +702,7 @@ int ZEXPORT deflateReset(strm) } /* ========================================================================= */ -int ZEXPORT deflateSetHeader(strm, head) - z_streamp strm; - gz_headerp head; -{ +int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) { if (deflateStateCheck(strm) || strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; @@ -561,11 +710,7 @@ int ZEXPORT deflateSetHeader(strm, head) } /* ========================================================================= */ -int ZEXPORT deflatePending(strm, pending, bits) - unsigned *pending; - int *bits; - z_streamp strm; -{ +int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; @@ -575,19 +720,21 @@ int ZEXPORT deflatePending(strm, pending, bits) } /* ========================================================================= */ -int ZEXPORT deflatePrime(strm, bits, value) - z_streamp strm; - int bits; - int value; -{ +int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { deflate_state *s; int put; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; +#ifdef LIT_MEM + if (bits < 0 || bits > 16 || + (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; +#else if (bits < 0 || bits > 16 || s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; +#endif do { put = Buf_size - s->bi_valid; if (put > bits) @@ -602,11 +749,7 @@ int ZEXPORT deflatePrime(strm, bits, value) } /* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ +int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) { deflate_state *s; compress_func func; @@ -651,13 +794,8 @@ int ZEXPORT deflateParams(strm, level, strategy) } /* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ +int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy, + int nice_length, int max_chain) { deflate_state *s; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -693,10 +831,7 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) * * Shifts are used to approximate divisions, for speed. */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ +uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) { deflate_state *s; uLong fixedlen, storelen, wraplen; @@ -752,7 +887,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) /* if not default parameters, return one of the conservative bounds */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; + return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + + wraplen; /* default settings: return tight bound for that case -- ~0.03% overhead plus a small constant */ @@ -765,10 +901,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ -local void putShortMSB(s, b) - deflate_state *s; - uInt b; -{ +local void putShortMSB(deflate_state *s, uInt b) { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } @@ -779,9 +912,7 @@ local void putShortMSB(s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ -local void flush_pending(strm) - z_streamp strm; -{ +local void flush_pending(z_streamp strm) { unsigned len; deflate_state *s = strm->state; @@ -812,10 +943,7 @@ local void flush_pending(strm) } while (0) /* ========================================================================= */ -int ZEXPORT deflate(strm, flush) - z_streamp strm; - int flush; -{ +int ZEXPORT deflate(z_streamp strm, int flush) { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; @@ -1127,9 +1255,7 @@ int ZEXPORT deflate(strm, flush) } /* ========================================================================= */ -int ZEXPORT deflateEnd(strm) - z_streamp strm; -{ +int ZEXPORT deflateEnd(z_streamp strm) { int status; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1153,11 +1279,10 @@ int ZEXPORT deflateEnd(strm) * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ -int ZEXPORT deflateCopy(dest, source) - z_streamp dest; - z_streamp source; -{ +int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { #ifdef MAXSEG_64K + (void)dest; + (void)source; return Z_STREAM_ERROR; #else deflate_state *ds; @@ -1181,7 +1306,7 @@ int ZEXPORT deflateCopy(dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1192,10 +1317,15 @@ int ZEXPORT deflateCopy(dest, source) zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +#ifdef LIT_MEM + ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); + ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2); +#else ds->sym_buf = ds->pending_buf + ds->lit_bufsize; +#endif ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1205,66 +1335,6 @@ int ZEXPORT deflateCopy(dest, source) #endif /* MAXSEG_64K */ } -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local unsigned read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, buf, len); - } -#endif - strm->next_in += len; - strm->total_in += len; - - return len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init(s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -} - #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and @@ -1275,10 +1345,7 @@ local void lm_init(s) * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ @@ -1426,10 +1493,7 @@ local uInt longest_match(s, cur_match) /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ @@ -1490,19 +1554,23 @@ local uInt longest_match(s, cur_match) /* =========================================================================== * Check that the match at match_start is indeed a match. */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ +local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); + Bytef *back = s->window + (int)match, *here = s->window + start; + IPos len = length; + if (match == (IPos)-1) { + /* match starts one byte before the current window -- just compare the + subsequent length-1 bytes */ + back++; + here++; + len--; + } + if (zmemcmp(back, here, len) != EQUAL) { + fprintf(stderr, " start %u, match %d, length %d\n", + start, (int)match, length); do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); + fprintf(stderr, "(%02x %02x)", *back++, *here++); + } while (--len != 0); z_error("invalid match"); } if (z_verbose > 1) { @@ -1514,137 +1582,6 @@ local void check_match(s, start, match, length) # define check_match(s, start, match, length) #endif /* ZLIB_DEBUG */ -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - unsigned n; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize + MAX_DIST(s)) { - - zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - if (s->insert > s->strstart) - s->insert = s->strstart; - slide_hash(s); - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. @@ -1687,10 +1624,7 @@ local void fill_window(s) * copied. It is most efficient with large input and output buffers, which * maximizes the opportunities to have a single copy from next_in to next_out. */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_stored(deflate_state *s, int flush) { /* Smallest worthy block size when not flushing or finishing. By default * this is 32K. This can be as small as 507 bytes for memLevel == 1. For * large input and output buffers, the stored block size will be larger. @@ -1874,10 +1808,7 @@ local block_state deflate_stored(s, flush) * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_fast(deflate_state *s, int flush) { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ @@ -1976,10 +1907,7 @@ local block_state deflate_fast(s, flush) * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_slow(deflate_state *s, int flush) { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ @@ -2107,10 +2035,7 @@ local block_state deflate_slow(s, flush) * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_rle(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ @@ -2181,10 +2106,7 @@ local block_state deflate_rle(s, flush) * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_huff(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ for (;;) { diff --git a/zlib/deflate.h b/zlib/deflate.h index 1a06cd5f2..300c6ada6 100644 --- a/zlib/deflate.h +++ b/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2018 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -23,6 +23,10 @@ # define GZIP #endif +/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at + the cost of a larger memory footprint */ +/* #define LIT_MEM */ + /* =========================================================================== * Internal compression state. */ @@ -217,7 +221,14 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ +#ifdef LIT_MEM +# define LIT_BUFS 5 + ushf *d_buf; /* buffer for distances */ + uchf *l_buf; /* buffer for literals/lengths */ +#else +# define LIT_BUFS 4 uchf *sym_buf; /* buffer for distances and literals/lengths */ +#endif uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,7 +250,7 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt sym_next; /* running index in sym_buf */ + uInt sym_next; /* running index in symbol buffer */ uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ @@ -291,14 +302,14 @@ typedef struct internal_state { memory checker errors from longest match routines */ /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_init(deflate_state *s); +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc); +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last); +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s); +void ZLIB_INTERNAL _tr_align(deflate_state *s); +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) @@ -318,6 +329,25 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, extern const uch ZLIB_INTERNAL _dist_code[]; #endif +#ifdef LIT_MEM +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->sym_next] = 0; \ + s->l_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->sym_next] = dist; \ + s->l_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +#else # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->sym_buf[s->sym_next++] = 0; \ @@ -337,6 +367,7 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->sym_next == s->sym_end); \ } +#endif #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ diff --git a/zlib/gzclose.c b/zlib/gzclose.c index caeb99a31..48d6a86f0 100644 --- a/zlib/gzclose.c +++ b/zlib/gzclose.c @@ -8,9 +8,7 @@ /* gzclose() is in a separate file so that it is linked in only if it is used. That way the other gzclose functions can be used instead to avoid linking in unneeded compression or decompression routines. */ -int ZEXPORT gzclose(file) - gzFile file; -{ +int ZEXPORT gzclose(gzFile file) { #ifndef NO_GZCOMPRESS gz_statep state; diff --git a/zlib/gzguts.h b/zlib/gzguts.h index 57faf3716..eba72085b 100644 --- a/zlib/gzguts.h +++ b/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -7,9 +7,8 @@ # ifndef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # endif -# ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -# endif +# undef _FILE_OFFSET_BITS +# undef _TIME_BITS #endif #ifdef HAVE_HIDDEN @@ -119,8 +118,8 @@ /* gz* functions always use library allocation functions */ #ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); + extern voidp malloc(uInt size); + extern void free(voidpf ptr); #endif /* get errno and strerror definition */ @@ -138,10 +137,10 @@ /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); #endif /* default memLevel */ @@ -203,17 +202,13 @@ typedef struct { typedef gz_state FAR *gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +void ZLIB_INTERNAL gz_error(gz_statep, int, const char *); #if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +char ZLIB_INTERNAL *gz_strwinerror(DWORD error); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ -#ifdef INT_MAX -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) -#else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) -#endif +unsigned ZLIB_INTERNAL gz_intmax(void); +#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) diff --git a/zlib/gzlib.c b/zlib/gzlib.c index 55da46a45..983153cc8 100644 --- a/zlib/gzlib.c +++ b/zlib/gzlib.c @@ -1,5 +1,5 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,10 +15,6 @@ #endif #endif -/* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); - #if defined UNDER_CE /* Map the Windows error number in ERROR to a locale-dependent error message @@ -30,9 +26,7 @@ local gzFile gz_open OF((const void *, int, const char *)); The gz_strwinerror function does not change the current setting of GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror(error) - DWORD error; -{ +char ZLIB_INTERNAL *gz_strwinerror(DWORD error) { static char buf[1024]; wchar_t *msgbuf; @@ -72,9 +66,7 @@ char ZLIB_INTERNAL *gz_strwinerror(error) #endif /* UNDER_CE */ /* Reset gzip file state */ -local void gz_reset(state) - gz_statep state; -{ +local void gz_reset(gz_statep state) { state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ state->eof = 0; /* not at end of file */ @@ -90,11 +82,7 @@ local void gz_reset(state) } /* Open a gzip file either by name or file descriptor. */ -local gzFile gz_open(path, fd, mode) - const void *path; - int fd; - const char *mode; -{ +local gzFile gz_open(const void *path, int fd, const char *mode) { gz_statep state; z_size_t len; int oflag; @@ -269,26 +257,17 @@ local gzFile gz_open(path, fd, mode) } /* -- see zlib.h -- */ -gzFile ZEXPORT gzopen(path, mode) - const char *path; - const char *mode; -{ +gzFile ZEXPORT gzopen(const char *path, const char *mode) { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ -gzFile ZEXPORT gzopen64(path, mode) - const char *path; - const char *mode; -{ +gzFile ZEXPORT gzopen64(const char *path, const char *mode) { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ -gzFile ZEXPORT gzdopen(fd, mode) - int fd; - const char *mode; -{ +gzFile ZEXPORT gzdopen(int fd, const char *mode) { char *path; /* identifier for error messages */ gzFile gz; @@ -306,19 +285,13 @@ gzFile ZEXPORT gzdopen(fd, mode) /* -- see zlib.h -- */ #ifdef WIDECHAR -gzFile ZEXPORT gzopen_w(path, mode) - const wchar_t *path; - const char *mode; -{ +gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) { return gz_open(path, -2, mode); } #endif /* -- see zlib.h -- */ -int ZEXPORT gzbuffer(file, size) - gzFile file; - unsigned size; -{ +int ZEXPORT gzbuffer(gzFile file, unsigned size) { gz_statep state; /* get internal structure and check integrity */ @@ -335,16 +308,14 @@ int ZEXPORT gzbuffer(file, size) /* check and set requested size */ if ((size << 1) < size) return -1; /* need to be able to double it */ - if (size < 2) - size = 2; /* need two bytes to check magic header */ + if (size < 8) + size = 8; /* needed to behave well with flushing */ state->want = size; return 0; } /* -- see zlib.h -- */ -int ZEXPORT gzrewind(file) - gzFile file; -{ +int ZEXPORT gzrewind(gzFile file) { gz_statep state; /* get internal structure */ @@ -365,11 +336,7 @@ int ZEXPORT gzrewind(file) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gzseek64(file, offset, whence) - gzFile file; - z_off64_t offset; - int whence; -{ +z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) { unsigned n; z_off64_t ret; gz_statep state; @@ -442,11 +409,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gzseek(file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ +z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) { z_off64_t ret; ret = gzseek64(file, (z_off64_t)offset, whence); @@ -454,9 +417,7 @@ z_off_t ZEXPORT gzseek(file, offset, whence) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gztell64(file) - gzFile file; -{ +z_off64_t ZEXPORT gztell64(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -471,9 +432,7 @@ z_off64_t ZEXPORT gztell64(file) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gztell(file) - gzFile file; -{ +z_off_t ZEXPORT gztell(gzFile file) { z_off64_t ret; ret = gztell64(file); @@ -481,9 +440,7 @@ z_off_t ZEXPORT gztell(file) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gzoffset64(file) - gzFile file; -{ +z_off64_t ZEXPORT gzoffset64(gzFile file) { z_off64_t offset; gz_statep state; @@ -504,9 +461,7 @@ z_off64_t ZEXPORT gzoffset64(file) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gzoffset(file) - gzFile file; -{ +z_off_t ZEXPORT gzoffset(gzFile file) { z_off64_t ret; ret = gzoffset64(file); @@ -514,9 +469,7 @@ z_off_t ZEXPORT gzoffset(file) } /* -- see zlib.h -- */ -int ZEXPORT gzeof(file) - gzFile file; -{ +int ZEXPORT gzeof(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -531,10 +484,7 @@ int ZEXPORT gzeof(file) } /* -- see zlib.h -- */ -const char * ZEXPORT gzerror(file, errnum) - gzFile file; - int *errnum; -{ +const char * ZEXPORT gzerror(gzFile file, int *errnum) { gz_statep state; /* get internal structure and check integrity */ @@ -552,9 +502,7 @@ const char * ZEXPORT gzerror(file, errnum) } /* -- see zlib.h -- */ -void ZEXPORT gzclearerr(file) - gzFile file; -{ +void ZEXPORT gzclearerr(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -578,11 +526,7 @@ void ZEXPORT gzclearerr(file) memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ -void ZLIB_INTERNAL gz_error(state, err, msg) - gz_statep state; - int err; - const char *msg; -{ +void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) @@ -619,21 +563,20 @@ void ZLIB_INTERNAL gz_error(state, err, msg) #endif } -#ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax() -{ - unsigned p, q; - - p = 1; +unsigned ZLIB_INTERNAL gz_intmax(void) { +#ifdef INT_MAX + return INT_MAX; +#else + unsigned p = 1, q; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; -} #endif +} diff --git a/zlib/gzread.c b/zlib/gzread.c index dd7738159..4168cbc88 100644 --- a/zlib/gzread.c +++ b/zlib/gzread.c @@ -5,25 +5,12 @@ #include "gzguts.h" -/* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); -local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); - /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. This function needs to loop on read(), since read() is not guaranteed to read the number of bytes requested, depending on the type of descriptor. */ -local int gz_load(state, buf, len, have) - gz_statep state; - unsigned char *buf; - unsigned len; - unsigned *have; -{ +local int gz_load(gz_statep state, unsigned char *buf, unsigned len, + unsigned *have) { int ret; unsigned get, max = ((unsigned)-1 >> 2) + 1; @@ -53,9 +40,7 @@ local int gz_load(state, buf, len, have) If strm->avail_in != 0, then the current data is moved to the beginning of the input buffer, and then the remainder of the buffer is loaded with the available data from the input file. */ -local int gz_avail(state) - gz_statep state; -{ +local int gz_avail(gz_statep state) { unsigned got; z_streamp strm = &(state->strm); @@ -88,9 +73,7 @@ local int gz_avail(state) case, all further file reads will be directly to either the output buffer or a user buffer. If decompressing, the inflate state will be initialized. gz_look() will return 0 on success or -1 on failure. */ -local int gz_look(state) - gz_statep state; -{ +local int gz_look(gz_statep state) { z_streamp strm = &(state->strm); /* allocate read buffers and inflate memory */ @@ -170,9 +153,7 @@ local int gz_look(state) data. If the gzip stream completes, state->how is reset to LOOK to look for the next gzip stream or raw data, once state->x.have is depleted. Returns 0 on success, -1 on failure. */ -local int gz_decomp(state) - gz_statep state; -{ +local int gz_decomp(gz_statep state) { int ret = Z_OK; unsigned had; z_streamp strm = &(state->strm); @@ -224,9 +205,7 @@ local int gz_decomp(state) looked for to determine whether to copy or decompress. Returns -1 on error, otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the end of the input file has been reached and all data has been processed. */ -local int gz_fetch(state) - gz_statep state; -{ +local int gz_fetch(gz_statep state) { z_streamp strm = &(state->strm); do { @@ -254,10 +233,7 @@ local int gz_fetch(state) } /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ -local int gz_skip(state, len) - gz_statep state; - z_off64_t len; -{ +local int gz_skip(gz_statep state, z_off64_t len) { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ @@ -289,11 +265,7 @@ local int gz_skip(state, len) input. Return the number of bytes read. If zero is returned, either the end of file was reached, or there was an error. state->err must be consulted in that case to determine which. */ -local z_size_t gz_read(state, buf, len) - gz_statep state; - voidp buf; - z_size_t len; -{ +local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) { z_size_t got; unsigned n; @@ -370,11 +342,7 @@ local z_size_t gz_read(state, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzread(file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ +int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) { gz_statep state; /* get internal structure */ @@ -406,12 +374,7 @@ int ZEXPORT gzread(file, buf, len) } /* -- see zlib.h -- */ -z_size_t ZEXPORT gzfread(buf, size, nitems, file) - voidp buf; - z_size_t size; - z_size_t nitems; - gzFile file; -{ +z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) { z_size_t len; gz_statep state; @@ -442,9 +405,7 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) #else # undef gzgetc #endif -int ZEXPORT gzgetc(file) - gzFile file; -{ +int ZEXPORT gzgetc(gzFile file) { unsigned char buf[1]; gz_statep state; @@ -469,17 +430,12 @@ int ZEXPORT gzgetc(file) return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; } -int ZEXPORT gzgetc_(file) -gzFile file; -{ +int ZEXPORT gzgetc_(gzFile file) { return gzgetc(file); } /* -- see zlib.h -- */ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ +int ZEXPORT gzungetc(int c, gzFile file) { gz_statep state; /* get internal structure */ @@ -487,6 +443,10 @@ int ZEXPORT gzungetc(c, file) return -1; state = (gz_statep)file; + /* in case this was just opened, set up the input buffer */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) @@ -536,11 +496,7 @@ int ZEXPORT gzungetc(c, file) } /* -- see zlib.h -- */ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ +char * ZEXPORT gzgets(gzFile file, char *buf, int len) { unsigned left, n; char *str; unsigned char *eol; @@ -600,9 +556,7 @@ char * ZEXPORT gzgets(file, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzdirect(file) - gzFile file; -{ +int ZEXPORT gzdirect(gzFile file) { gz_statep state; /* get internal structure */ @@ -620,9 +574,7 @@ int ZEXPORT gzdirect(file) } /* -- see zlib.h -- */ -int ZEXPORT gzclose_r(file) - gzFile file; -{ +int ZEXPORT gzclose_r(gzFile file) { int ret, err; gz_statep state; diff --git a/zlib/gzwrite.c b/zlib/gzwrite.c index eb8a0e589..435b4621b 100644 --- a/zlib/gzwrite.c +++ b/zlib/gzwrite.c @@ -5,18 +5,10 @@ #include "gzguts.h" -/* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); -local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); - /* Initialize state for writing a gzip file. Mark initialization by setting state->size to non-zero. Return -1 on a memory allocation failure, or 0 on success. */ -local int gz_init(state) - gz_statep state; -{ +local int gz_init(gz_statep state) { int ret; z_streamp strm = &(state->strm); @@ -70,10 +62,7 @@ local int gz_init(state) deflate() flush value. If flush is Z_FINISH, then the deflate() state is reset to start a new gzip stream. If gz->direct is true, then simply write to the output file without compressing, and ignore flush. */ -local int gz_comp(state, flush) - gz_statep state; - int flush; -{ +local int gz_comp(gz_statep state, int flush) { int ret, writ; unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); @@ -151,10 +140,7 @@ local int gz_comp(state, flush) /* Compress len zeros to output. Return -1 on a write error or memory allocation failure by gz_comp(), or 0 on success. */ -local int gz_zero(state, len) - gz_statep state; - z_off64_t len; -{ +local int gz_zero(gz_statep state, z_off64_t len) { int first; unsigned n; z_streamp strm = &(state->strm); @@ -184,11 +170,7 @@ local int gz_zero(state, len) /* Write len bytes from buf to file. Return the number of bytes written. If the returned value is less than len, then there was an error. */ -local z_size_t gz_write(state, buf, len) - gz_statep state; - voidpc buf; - z_size_t len; -{ +local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) { z_size_t put = len; /* if len is zero, avoid unnecessary operations */ @@ -252,11 +234,7 @@ local z_size_t gz_write(state, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzwrite(file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ +int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) { gz_statep state; /* get internal structure */ @@ -280,12 +258,8 @@ int ZEXPORT gzwrite(file, buf, len) } /* -- see zlib.h -- */ -z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) - voidpc buf; - z_size_t size; - z_size_t nitems; - gzFile file; -{ +z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems, + gzFile file) { z_size_t len; gz_statep state; @@ -310,10 +284,7 @@ z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) } /* -- see zlib.h -- */ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ +int ZEXPORT gzputc(gzFile file, int c) { unsigned have; unsigned char buf[1]; gz_statep state; @@ -358,10 +329,7 @@ int ZEXPORT gzputc(file, c) } /* -- see zlib.h -- */ -int ZEXPORT gzputs(file, s) - gzFile file; - const char *s; -{ +int ZEXPORT gzputs(gzFile file, const char *s) { z_size_t len, put; gz_statep state; @@ -388,8 +356,7 @@ int ZEXPORT gzputs(file, s) #include /* -- see zlib.h -- */ -int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) -{ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int len; unsigned left; char *next; @@ -460,8 +427,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) return len; } -int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) -{ +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) { va_list va; int ret; @@ -474,13 +440,10 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) #else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ -int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ +int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3, + int a4, int a5, int a6, int a7, int a8, int a9, int a10, + int a11, int a12, int a13, int a14, int a15, int a16, + int a17, int a18, int a19, int a20) { unsigned len, left; char *next; gz_statep state; @@ -562,10 +525,7 @@ int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, #endif /* -- see zlib.h -- */ -int ZEXPORT gzflush(file, flush) - gzFile file; - int flush; -{ +int ZEXPORT gzflush(gzFile file, int flush) { gz_statep state; /* get internal structure */ @@ -594,11 +554,7 @@ int ZEXPORT gzflush(file, flush) } /* -- see zlib.h -- */ -int ZEXPORT gzsetparams(file, level, strategy) - gzFile file; - int level; - int strategy; -{ +int ZEXPORT gzsetparams(gzFile file, int level, int strategy) { gz_statep state; z_streamp strm; @@ -609,7 +565,7 @@ int ZEXPORT gzsetparams(file, level, strategy) strm = &(state->strm); /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) + if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct) return Z_STREAM_ERROR; /* if no change is requested, then do nothing */ @@ -636,9 +592,7 @@ int ZEXPORT gzsetparams(file, level, strategy) } /* -- see zlib.h -- */ -int ZEXPORT gzclose_w(file) - gzFile file; -{ +int ZEXPORT gzclose_w(gzFile file) { int ret = Z_OK; gz_statep state; diff --git a/zlib/infback.c b/zlib/infback.c index babeaf180..e7b25b307 100644 --- a/zlib/infback.c +++ b/zlib/infback.c @@ -15,9 +15,6 @@ #include "inflate.h" #include "inffast.h" -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); - /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. @@ -25,13 +22,9 @@ local void fixedtables OF((struct inflate_state FAR *state)); windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ -int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) -z_streamp strm; -int windowBits; -unsigned char FAR *window; -const char *version; -int stream_size; -{ +int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, const char *version, + int stream_size) { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || @@ -80,9 +73,7 @@ int stream_size; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -248,13 +239,8 @@ struct inflate_state FAR *state; inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ -int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) -z_streamp strm; -in_func in; -void FAR *in_desc; -out_func out; -void FAR *out_desc; -{ +int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -632,9 +618,7 @@ void FAR *out_desc; return ret; } -int ZEXPORT inflateBackEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateBackEnd(z_streamp strm) { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); diff --git a/zlib/inffast.c b/zlib/inffast.c index 1fec7f363..9354676e7 100644 --- a/zlib/inffast.c +++ b/zlib/inffast.c @@ -47,10 +47,7 @@ requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) { struct inflate_state FAR *state; z_const unsigned char FAR *in; /* local strm->next_in */ z_const unsigned char FAR *last; /* have enough input while in < last */ diff --git a/zlib/inffast.h b/zlib/inffast.h index e5c1aa4ca..49c6d156c 100644 --- a/zlib/inffast.h +++ b/zlib/inffast.h @@ -8,4 +8,4 @@ subject to change. Applications should only use zlib.h. */ -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start); diff --git a/zlib/inflate.c b/zlib/inflate.c index 8acbef44e..94ecff015 100644 --- a/zlib/inflate.c +++ b/zlib/inflate.c @@ -91,20 +91,7 @@ # endif #endif -/* function prototypes */ -local int inflateStateCheck OF((z_streamp strm)); -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, - unsigned copy)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, - unsigned len)); - -local int inflateStateCheck(strm) -z_streamp strm; -{ +local int inflateStateCheck(z_streamp strm) { struct inflate_state FAR *state; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -116,9 +103,7 @@ z_streamp strm; return 0; } -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ +int ZEXPORT inflateResetKeep(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -142,9 +127,7 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ +int ZEXPORT inflateReset(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -155,10 +138,7 @@ z_streamp strm; return inflateResetKeep(strm); } -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ +int ZEXPORT inflateReset2(z_streamp strm, int windowBits) { int wrap; struct inflate_state FAR *state; @@ -195,12 +175,8 @@ int windowBits; return inflateReset(strm); } -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size) { int ret; struct inflate_state FAR *state; @@ -239,22 +215,17 @@ int stream_size; return ret; } -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit_(z_streamp strm, const char *version, + int stream_size) { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ +int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + if (bits == 0) + return Z_OK; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; @@ -278,9 +249,7 @@ int value; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -342,7 +311,7 @@ struct inflate_state FAR *state; a.out > inffixed.h */ -void makefixed() +void makefixed(void) { unsigned low, size; struct inflate_state state; @@ -396,11 +365,7 @@ void makefixed() output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -local int updatewindow(strm, end, copy) -z_streamp strm; -const Bytef *end; -unsigned copy; -{ +local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) { struct inflate_state FAR *state; unsigned dist; @@ -622,10 +587,7 @@ unsigned copy; will return Z_BUF_ERROR if it has not reached the end of the stream. */ -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ +int ZEXPORT inflate(z_streamp strm, int flush) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -1301,9 +1263,7 @@ int flush; return ret; } -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateEnd(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1315,11 +1275,8 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ +int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { struct inflate_state FAR *state; /* check state */ @@ -1338,11 +1295,8 @@ uInt *dictLength; return Z_OK; } -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ +int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { struct inflate_state FAR *state; unsigned long dictid; int ret; @@ -1373,10 +1327,7 @@ uInt dictLength; return Z_OK; } -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ +int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) { struct inflate_state FAR *state; /* check state */ @@ -1401,11 +1352,8 @@ gz_headerp head; called again with more data and the *have state. *have is initialized to zero for the first call. */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -const unsigned char FAR *buf; -unsigned len; -{ +local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, + unsigned len) { unsigned got; unsigned next; @@ -1424,9 +1372,7 @@ unsigned len; return next; } -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ +int ZEXPORT inflateSync(z_streamp strm) { unsigned len; /* number of bytes to look at or looked at */ int flags; /* temporary to save header status */ unsigned long in, out; /* temporary to save total_in and total_out */ @@ -1441,7 +1387,7 @@ z_streamp strm; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { @@ -1482,9 +1428,7 @@ z_streamp strm; block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ +int ZEXPORT inflateSyncPoint(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1492,10 +1436,7 @@ z_streamp strm; return state->mode == STORED && state->bits == 0; } -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ +int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; @@ -1539,10 +1480,7 @@ z_streamp source; return Z_OK; } -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ +int ZEXPORT inflateUndermine(z_streamp strm, int subvert) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1557,10 +1495,7 @@ int subvert; #endif } -int ZEXPORT inflateValidate(strm, check) -z_streamp strm; -int check; -{ +int ZEXPORT inflateValidate(z_streamp strm, int check) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1572,9 +1507,7 @@ int check; return Z_OK; } -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ +long ZEXPORT inflateMark(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) @@ -1585,9 +1518,7 @@ z_streamp strm; (state->mode == MATCH ? state->was - state->length : 0)); } -unsigned long ZEXPORT inflateCodesUsed(strm) -z_streamp strm; -{ +unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return (unsigned long)-1; state = (struct inflate_state FAR *)strm->state; diff --git a/zlib/inftrees.c b/zlib/inftrees.c index 57d2793be..98cfe1644 100644 --- a/zlib/inftrees.c +++ b/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2022 Mark Adler + * Copyright (C) 1995-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.13 Copyright 1995-2022 Mark Adler "; + " inflate 1.3.1 Copyright 1995-2024 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,14 +29,9 @@ const char inflate_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ @@ -62,7 +57,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/zlib/inftrees.h b/zlib/inftrees.h index f53665311..396f74b5d 100644 --- a/zlib/inftrees.h +++ b/zlib/inftrees.h @@ -41,8 +41,8 @@ typedef struct { examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + returns 852, and "enough 30 6 15" for distance codes returns 592. The + initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ @@ -57,6 +57,6 @@ typedef enum { DISTS } codetype; -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work); diff --git a/zlib/resync_zlib b/zlib/resync_zlib index 2516582c0..8b0612ef1 100755 --- a/zlib/resync_zlib +++ b/zlib/resync_zlib @@ -10,8 +10,8 @@ git checkout -- zlib mv zlib zlib.old -tar -xzvf ../../Downloads/zlib-1.2.13.tar.gz -mv zlib-1.2.13 zlib +tar -xzvf ../../Downloads/zlib-1.3.1.tar.gz +mv zlib-1.3.1 zlib cd zlib mv doc/algorithm.txt . @@ -32,10 +32,12 @@ rm -f configure rm -f CMakeLists.txt rm -f INDEX rm -f Makefile +rm -f Makefile.in rm -f make_vms.com rm -f treebuild.xml rm -f zlib2ansi rm -f zconf.h.cmakein +rm -f zconf.h.in rm -f zlib.3.pdf rm -f zlib.map rm -f zlib.pc.cmakein @@ -49,6 +51,7 @@ rm -fr contrib/infback9 rm -fr contrib/iostream rm -fr contrib/iostream2 rm -fr contrib/iostream3 +rm -fr contrib/nuget rm -fr contrib/pascal rm -fr contrib/puff rm -fr contrib/README.contrib @@ -63,15 +66,6 @@ cd .. find zlib | sort > zlib.new.list find zlib.old | sort > zlib.old.list -# copy patches -cp -p zlib.old/contrib/minizip/ioapi.c.patch zlib/contrib/minizip - -# apply patches -cd zlib/contrib/minizip -patch < ioapi.c.patch -cd ../.. - -cd .. cp resync_zlib zlib echo "you must manually edit README.gpsbabel" diff --git a/zlib/trees.c b/zlib/trees.c index 5f305c472..6a523ef34 100644 --- a/zlib/trees.c +++ b/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2021 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -122,39 +122,116 @@ struct static_tree_desc_s { int max_length; /* max bit length for the codes */ }; -local const static_tree_desc static_l_desc = +#ifdef NO_INIT_GLOBAL_POINTERS +# define TCONST +#else +# define TCONST const +#endif + +local TCONST static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local const static_tree_desc static_d_desc = +local TCONST static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; -local const static_tree_desc static_bl_desc = +local TCONST static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== - * Local (static) routines in this file. + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 */ +local unsigned bi_reverse(unsigned code, int len) { + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned code, int len)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(deflate_state *s) { + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(deflate_state *s) { + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent + 7) & ~7; +#endif +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) { + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, + "inconsistent bit counts"); + Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); + + for (n = 0; n <= max_code; n++) { + int len = tree[n].Len; + if (len == 0) continue; + /* Now reverse the bits */ + tree[n].Code = (ush)bi_reverse(next_code[len]++, len); + + Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); + } +} #ifdef GEN_TREES_H -local void gen_trees_header OF((void)); +local void gen_trees_header(void); #endif #ifndef ZLIB_DEBUG @@ -167,27 +244,12 @@ local void gen_trees_header OF((void)); send_bits(s, tree[c].Code, tree[c].Len); } #endif -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef ZLIB_DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ +local void send_bits(deflate_state *s, int value, int length) { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; @@ -229,8 +291,7 @@ local void send_bits(s, value, length) /* =========================================================================== * Initialize the various 'constant' tables. */ -local void tr_static_init() -{ +local void tr_static_init(void) { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ @@ -323,8 +384,7 @@ local void tr_static_init() ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width) - 1 ? ",\n" : ", ")) -void gen_trees_header() -{ +void gen_trees_header(void) { FILE *header = fopen("trees.h", "w"); int i; @@ -373,12 +433,26 @@ void gen_trees_header() } #endif /* GEN_TREES_H */ +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(deflate_state *s) { + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->sym_next = s->matches = 0; +} + /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_init(deflate_state *s) { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; @@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s) init_block(s); } -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->sym_next = s->matches = 0; -} - #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ @@ -448,11 +504,7 @@ local void init_block(s) * when the heap property is re-established (each father smaller than its * two sons). */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ +local void pqdownheap(deflate_state *s, ct_data *tree, int k) { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { @@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k) * The length opt_len is updated; static_len is also updated if stree is * not null. */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void gen_bitlen(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; @@ -561,48 +610,9 @@ local void gen_bitlen(s, desc) } } -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes(tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - unsigned code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = (ush)code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, - "inconsistent bit counts"); - Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); - - for (n = 0; n <= max_code; n++) { - int len = tree[n].Len; - if (len == 0) continue; - /* Now reverse the bits */ - tree[n].Code = (ush)bi_reverse(next_code[len]++, len); - - Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", - n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); - } -} +#ifdef DUMP_BL_TREE +# include +#endif /* =========================================================================== * Construct one Huffman tree and assigns the code bit strings and lengths. @@ -612,10 +622,7 @@ local void gen_codes(tree, max_code, bl_count) * and corresponding code. The length opt_len is updated; static_len is * also updated if stree is not null. The field max_code is set. */ -local void build_tree(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void build_tree(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; @@ -700,11 +707,7 @@ local void build_tree(s, desc) * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ -local void scan_tree(s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void scan_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -745,11 +748,7 @@ local void scan_tree(s, tree, max_code) * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ -local void send_tree(s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void send_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -796,9 +795,7 @@ local void send_tree(s, tree, max_code) * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ -local int build_bl_tree(s) - deflate_state *s; -{ +local int build_bl_tree(deflate_state *s) { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ @@ -831,10 +828,8 @@ local int build_bl_tree(s) * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ +local void send_all_trees(deflate_state *s, int lcodes, int dcodes, + int blcodes) { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); @@ -860,12 +855,8 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) /* =========================================================================== * Send a stored block */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); @@ -884,9 +875,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ -void ZLIB_INTERNAL _tr_flush_bits(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { bi_flush(s); } @@ -894,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s) * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_align(deflate_state *s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef ZLIB_DEBUG @@ -905,16 +892,108 @@ void ZLIB_INTERNAL _tr_align(s) bi_flush(s); } +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(deflate_state *s, const ct_data *ltree, + const ct_data *dtree) { + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned sx = 0; /* running index in symbol buffers */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->sym_next != 0) do { +#ifdef LIT_MEM + dist = s->d_buf[sx]; + lc = s->l_buf[sx++]; +#else + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; +#endif + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check for no overlay of pending_buf on needed symbols */ +#ifdef LIT_MEM + Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow"); +#else + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); +#endif + + } while (sx < s->sym_next); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "block list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(deflate_state *s) { + /* block_mask is the bit mask of block-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long block_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>= 1) + if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("allow-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "block-listed" or "allow-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and write out the encoded block. */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -1011,14 +1090,15 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int ZLIB_INTERNAL _tr_tally(s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */ -{ +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { +#ifdef LIT_MEM + s->d_buf[s->sym_next] = (ush)dist; + s->l_buf[s->sym_next++] = (uch)lc; +#else s->sym_buf[s->sym_next++] = (uch)dist; s->sym_buf[s->sym_next++] = (uch)(dist >> 8); s->sym_buf[s->sym_next++] = (uch)lc; +#endif if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1035,147 +1115,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc) } return (s->sym_next == s->sym_end); } - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - const ct_data *ltree; /* literal tree */ - const ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned sx = 0; /* running index in sym_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->sym_next != 0) do { - dist = s->sym_buf[sx++] & 0xff; - dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; - lc = s->sym_buf[sx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= (unsigned)base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - - } while (sx < s->sym_next); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long block_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>= 1) - if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("allow-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent + 7) & ~7; -#endif -} diff --git a/zlib/uncompr.c b/zlib/uncompr.c index f9532f46c..5e256663b 100644 --- a/zlib/uncompr.c +++ b/zlib/uncompr.c @@ -24,12 +24,8 @@ Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ -int ZEXPORT uncompress2(dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong *sourceLen; -{ +int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -83,11 +79,7 @@ int ZEXPORT uncompress2(dest, destLen, source, sourceLen) err; } -int ZEXPORT uncompress(dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return uncompress2(dest, destLen, source, &sourceLen); } diff --git a/zlib/zconf.h b/zlib/zconf.h index bf977d3e7..62adc8d84 100644 --- a/zlib/zconf.h +++ b/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -241,7 +241,11 @@ #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -296,14 +300,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -520,7 +516,7 @@ typedef uLong FAR uLongf; #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/zlib/zconf.h.in b/zlib/zconf.h.in deleted file mode 100644 index bf977d3e7..000000000 --- a/zlib/zconf.h.in +++ /dev/null @@ -1,547 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - * Even better than compiling with -DZ_PREFIX would be to use configure to set - * this permanently in zconf.h using "./configure --zprefix". - */ -#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ -# define Z_PREFIX_SET - -/* all linked symbols and init macros */ -# define _dist_code z__dist_code -# define _length_code z__length_code -# define _tr_align z__tr_align -# define _tr_flush_bits z__tr_flush_bits -# define _tr_flush_block z__tr_flush_block -# define _tr_init z__tr_init -# define _tr_stored_block z__tr_stored_block -# define _tr_tally z__tr_tally -# define adler32 z_adler32 -# define adler32_combine z_adler32_combine -# define adler32_combine64 z_adler32_combine64 -# define adler32_z z_adler32_z -# ifndef Z_SOLO -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# endif -# define crc32 z_crc32 -# define crc32_combine z_crc32_combine -# define crc32_combine64 z_crc32_combine64 -# define crc32_combine_gen z_crc32_combine_gen -# define crc32_combine_gen64 z_crc32_combine_gen64 -# define crc32_combine_op z_crc32_combine_op -# define crc32_z z_crc32_z -# define deflate z_deflate -# define deflateBound z_deflateBound -# define deflateCopy z_deflateCopy -# define deflateEnd z_deflateEnd -# define deflateGetDictionary z_deflateGetDictionary -# define deflateInit z_deflateInit -# define deflateInit2 z_deflateInit2 -# define deflateInit2_ z_deflateInit2_ -# define deflateInit_ z_deflateInit_ -# define deflateParams z_deflateParams -# define deflatePending z_deflatePending -# define deflatePrime z_deflatePrime -# define deflateReset z_deflateReset -# define deflateResetKeep z_deflateResetKeep -# define deflateSetDictionary z_deflateSetDictionary -# define deflateSetHeader z_deflateSetHeader -# define deflateTune z_deflateTune -# define deflate_copyright z_deflate_copyright -# define get_crc_table z_get_crc_table -# ifndef Z_SOLO -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzfread z_gzfread -# define gzfwrite z_gzfwrite -# define gzgetc z_gzgetc -# define gzgetc_ z_gzgetc_ -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# ifdef _WIN32 -# define gzopen_w z_gzopen_w -# endif -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzvprintf z_gzvprintf -# define gzwrite z_gzwrite -# endif -# define inflate z_inflate -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define inflateBackInit z_inflateBackInit -# define inflateBackInit_ z_inflateBackInit_ -# define inflateCodesUsed z_inflateCodesUsed -# define inflateCopy z_inflateCopy -# define inflateEnd z_inflateEnd -# define inflateGetDictionary z_inflateGetDictionary -# define inflateGetHeader z_inflateGetHeader -# define inflateInit z_inflateInit -# define inflateInit2 z_inflateInit2 -# define inflateInit2_ z_inflateInit2_ -# define inflateInit_ z_inflateInit_ -# define inflateMark z_inflateMark -# define inflatePrime z_inflatePrime -# define inflateReset z_inflateReset -# define inflateReset2 z_inflateReset2 -# define inflateResetKeep z_inflateResetKeep -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateUndermine z_inflateUndermine -# define inflateValidate z_inflateValidate -# define inflate_copyright z_inflate_copyright -# define inflate_fast z_inflate_fast -# define inflate_table z_inflate_table -# ifndef Z_SOLO -# define uncompress z_uncompress -# define uncompress2 z_uncompress2 -# endif -# define zError z_zError -# ifndef Z_SOLO -# define zcalloc z_zcalloc -# define zcfree z_zcfree -# endif -# define zlibCompileFlags z_zlibCompileFlags -# define zlibVersion z_zlibVersion - -/* all zlib typedefs in zlib.h and zconf.h */ -# define Byte z_Byte -# define Bytef z_Bytef -# define alloc_func z_alloc_func -# define charf z_charf -# define free_func z_free_func -# ifndef Z_SOLO -# define gzFile z_gzFile -# endif -# define gz_header z_gz_header -# define gz_headerp z_gz_headerp -# define in_func z_in_func -# define intf z_intf -# define out_func z_out_func -# define uInt z_uInt -# define uIntf z_uIntf -# define uLong z_uLong -# define uLongf z_uLongf -# define voidp z_voidp -# define voidpc z_voidpc -# define voidpf z_voidpf - -/* all zlib structs in zlib.h and zconf.h */ -# define gz_header_s z_gz_header_s -# define internal_state z_internal_state - -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const -#endif - -#ifdef Z_SOLO - typedef unsigned long z_size_t; -#else -# define z_longlong long long -# if defined(NO_SIZE_T) - typedef unsigned NO_SIZE_T z_size_t; -# elif defined(STDC) -# include - typedef size_t z_size_t; -# else - typedef unsigned long z_size_t; -# endif -# undef z_longlong -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus about 7 kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) -# include -# if (UINT_MAX == 0xffffffffUL) -# define Z_U4 unsigned -# elif (ULONG_MAX == 0xffffffffUL) -# define Z_U4 unsigned long -# elif (USHRT_MAX == 0xffffffffUL) -# define Z_U4 unsigned short -# endif -#endif - -#ifdef Z_U4 - typedef Z_U4 z_crc_t; -#else - typedef unsigned long z_crc_t; -#endif - -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ -# define Z_HAVE_UNISTD_H -#endif - -#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ -# define Z_HAVE_STDARG_H -#endif - -#ifdef STDC -# ifndef Z_SOLO -# include /* for off_t */ -# endif -#endif - -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifndef Z_SOLO -# include /* for va_list */ -# endif -#endif - -#ifdef _WIN32 -# ifndef Z_SOLO -# include /* for wchar_t */ -# endif -#endif - -/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and - * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even - * though the former does not conform to the LFS document), but considering - * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as - * equivalently requesting no 64-bit operations - */ -#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 -# undef _LARGEFILE64_SOURCE -#endif - -#ifndef Z_HAVE_UNISTD_H -# ifdef __WATCOMC__ -# define Z_HAVE_UNISTD_H -# endif -#endif -#ifndef Z_HAVE_UNISTD_H -# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) -# define Z_HAVE_UNISTD_H -# endif -#endif -#ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) -# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t -# endif -# endif -#endif - -#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 -# define Z_LFS64 -#endif - -#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) -# define Z_LARGE64 -#endif - -#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) -# define Z_WANT64 -#endif - -#if !defined(SEEK_SET) && !defined(Z_SOLO) -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif - -#ifndef z_off_t -# define z_off_t long -#endif - -#if !defined(_WIN32) && defined(Z_LARGE64) -# define z_off64_t off64_t -#else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t __int64 -# else -# define z_off64_t z_off_t -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) - #pragma map(deflateInit_,"DEIN") - #pragma map(deflateInit2_,"DEIN2") - #pragma map(deflateEnd,"DEEND") - #pragma map(deflateBound,"DEBND") - #pragma map(inflateInit_,"ININ") - #pragma map(inflateInit2_,"ININ2") - #pragma map(inflateEnd,"INEND") - #pragma map(inflateSync,"INSY") - #pragma map(inflateSetDictionary,"INSEDI") - #pragma map(compressBound,"CMBND") - #pragma map(inflate_table,"INTABL") - #pragma map(inflate_fast,"INFA") - #pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/zlib/zlib.3 b/zlib/zlib.3 index 6f6e91404..c716020ea 100644 --- a/zlib/zlib.3 +++ b/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "13 Oct 2022" +.TH ZLIB 3 "22 Jan 2024" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -105,9 +105,9 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS AND LICENSE -Version 1.2.13 +Version 1.3.1 .LP -Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler .LP This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/zlib/zlib.h b/zlib/zlib.h index 953cb5012..8d4b932ea 100644 --- a/zlib/zlib.h +++ b/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.13, October 13th, 2022 + version 1.3.1, January 22nd, 2024 - Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.13" -#define ZLIB_VERNUM 0x12d0 +#define ZLIB_VERSION "1.3.1" +#define ZLIB_VERNUM 0x1310 #define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 13 +#define ZLIB_VER_MINOR 3 +#define ZLIB_VER_REVISION 1 #define ZLIB_VER_SUBREVISION 0 /* @@ -78,8 +78,8 @@ extern "C" { even in the case of corrupted input. */ -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); +typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size); +typedef void (*free_func)(voidpf opaque, voidpf address); struct internal_state; @@ -217,7 +217,7 @@ typedef gz_header FAR *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +ZEXTERN const char * ZEXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -225,12 +225,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); */ /* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. + allocation functions. total_in, total_out, adler, and msg are initialized. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all @@ -247,7 +247,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); */ -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -320,8 +320,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. + avail_out is greater than six when the flush marker begins, in order to avoid + repeated flush markers upon calling deflate() again when avail_out == 0. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was @@ -360,7 +360,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -375,7 +375,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateInit(z_streamp strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -383,7 +383,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. + them to use default allocation functions. total_in, total_out, adler, and + msg are initialized. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -397,7 +398,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); */ -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -517,7 +518,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -535,12 +536,12 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); */ /* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); +ZEXTERN int ZEXPORT deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); This is another version of deflateInit with more compression options. The fields zalloc, zfree and opaque must be initialized before by the caller. @@ -607,9 +608,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -651,9 +652,9 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -673,8 +674,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT deflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -691,20 +692,20 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateReset(z_streamp strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been - set unchanged. + set unchanged. total_in, total_out, adler, and msg are initialized. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); +ZEXTERN int ZEXPORT deflateParams(z_streamp strm, + int level, + int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be @@ -729,7 +730,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). + applied to the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if @@ -740,11 +741,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); +ZEXTERN int ZEXPORT deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -757,8 +758,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); +ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, + uLong sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -772,9 +773,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, than Z_FINISH or Z_NO_FLUSH are used. */ -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); +ZEXTERN int ZEXPORT deflatePending(z_streamp strm, + unsigned *pending, + int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -787,9 +788,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, + int bits, + int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -804,8 +805,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, + gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -821,16 +822,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). + the time set to zero, and os set to the current operating system, with no + extra, name, or comment fields. The gzip header is returned to the default + state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateInit2(z_streamp strm, + int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -883,9 +885,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -906,9 +908,9 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -921,7 +923,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateSync(z_streamp strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -934,14 +936,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -956,18 +958,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateReset(z_streamp strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. + total_in, total_out, adler, and msg are initialized. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateReset2(z_streamp strm, + int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -980,9 +983,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT inflatePrime(z_streamp strm, + int bits, + int value); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the @@ -1001,7 +1004,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +ZEXTERN long ZEXPORT inflateMark(z_streamp strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1029,8 +1032,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm, + gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1070,8 +1073,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); +ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits, + unsigned char FAR *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1091,13 +1094,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +typedef unsigned (*in_func)(void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned); -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack(z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1165,7 +1168,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm); /* All memory allocated by inflateBackInit() is freed. @@ -1173,7 +1176,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); state was inconsistent. */ -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +ZEXTERN uLong ZEXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1226,8 +1229,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); you need special options. */ -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1241,9 +1244,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, buffer. */ -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); +ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1257,15 +1260,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1282,8 +1285,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); +ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1302,7 +1305,7 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); Open the gzip (.gz) file at path for reading and decompressing, or compressing and writing. The mode parameter is as in fopen ("rb" or "wb") @@ -1339,7 +1342,7 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); file could not be opened. */ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* Associate a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file has @@ -1362,7 +1365,7 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); /* Set the internal buffer size used by this library's functions for file to size. The default buffer size is 8192 bytes. This function must be called @@ -1378,7 +1381,7 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); too late. */ -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); /* Dynamically update the compression level and strategy for file. See the description of deflateInit2 for the meaning of these parameters. Previously @@ -1389,7 +1392,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len); /* Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of @@ -1419,8 +1422,8 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); Z_STREAM_ERROR. */ -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, + gzFile file); /* Read and decompress up to nitems items of size size from file into buf, otherwise operating as gzread() does. This duplicates the interface of @@ -1445,14 +1448,14 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, file, resetting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* Compress and write the len uncompressed bytes at buf to file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, + z_size_t nitems, gzFile file); /* Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If @@ -1465,7 +1468,7 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, is returned, and the error state is set to Z_STREAM_ERROR. */ -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); /* Convert, format, compress, and write the arguments (...) to file under control of the string format, as in fprintf. gzprintf returns the number of @@ -1480,7 +1483,7 @@ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); This can be determined using zlibCompileFlags(). */ -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); /* Compress and write the given null-terminated string s to file, excluding the terminating null character. @@ -1488,7 +1491,7 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); gzputs returns the number of characters written, or -1 in case of error. */ -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); /* Read and decompress bytes from file into buf, until len-1 characters are read, or until a newline character is read and transferred to buf, or an @@ -1502,13 +1505,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc(gzFile file, int c); /* Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc(gzFile file); /* Read and decompress one byte from file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. @@ -1517,7 +1520,7 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); points to has been clobbered or not. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); /* Push c back onto the stream for file to be read as the first character on the next read. At least one character of push-back is always allowed. @@ -1529,7 +1532,7 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); /* Flush all pending output to file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function @@ -1545,8 +1548,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); */ /* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); +ZEXTERN z_off_t ZEXPORT gzseek(gzFile file, + z_off_t offset, int whence); Set the starting position to offset relative to whence for the next gzread or gzwrite on file. The offset represents a number of bytes in the @@ -1564,7 +1567,7 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +ZEXTERN int ZEXPORT gzrewind(gzFile file); /* Rewind file. This function is supported only for reading. @@ -1572,7 +1575,7 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); */ /* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gztell(gzFile file); Return the starting position for the next gzread or gzwrite on file. This position represents a number of bytes in the uncompressed data stream, @@ -1583,7 +1586,7 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); */ /* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); Return the current compressed (actual) read or write offset of file. This offset includes the count of bytes that precede the gzip stream, for example @@ -1592,7 +1595,7 @@ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); be used for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +ZEXTERN int ZEXPORT gzeof(gzFile file); /* Return true (1) if the end-of-file indicator for file has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set @@ -1607,7 +1610,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +ZEXTERN int ZEXPORT gzdirect(gzFile file); /* Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. @@ -1628,7 +1631,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose(gzFile file); /* Flush all pending output for file, if necessary, close file and deallocate the (de)compression state. Note that once file is closed, you @@ -1641,8 +1644,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r(gzFile file); +ZEXTERN int ZEXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1653,7 +1656,7 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* Return the error message for the last error which occurred on file. errnum is set to zlib error number. If an error occurred in the file system @@ -1669,7 +1672,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +ZEXTERN void ZEXPORT gzclearerr(gzFile file); /* Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip @@ -1686,7 +1689,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); library. */ -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. An Adler-32 value is in the range of a 32-bit @@ -1706,15 +1709,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, + z_size_t len); /* Same as adler32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); +ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, + z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1724,7 +1727,7 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. @@ -1742,30 +1745,30 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, + z_size_t len); /* Same as crc32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative. */ /* -ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); Return the operator corresponding to length len2, to be used with - crc32_combine_op(). + crc32_combine_op(). len2 must be non-negative. */ -ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); +ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); /* Give the same result as crc32_combine(), using op in place of len2. op is is generated from len2 by crc32_combine_gen(). This will be faster than @@ -1778,20 +1781,20 @@ ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateInit_(z_streamp strm, + const char *version, int stream_size); +ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); +ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1836,7 +1839,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ @@ -1853,13 +1856,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1881,50 +1884,50 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); # endif #else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif #else /* Z_SOLO */ - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif /* !Z_SOLO */ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +ZEXTERN const char * ZEXPORT zError(int); +ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void); +ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int); +ZEXTERN int ZEXPORT inflateValidate(z_streamp, int); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp); +ZEXTERN int ZEXPORT inflateResetKeep(z_streamp); +ZEXTERN int ZEXPORT deflateResetKeep(z_streamp); #if defined(_WIN32) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, + const char *mode); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); +ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, + const char *format, + va_list va); # endif #endif diff --git a/zlib/zutil.c b/zlib/zutil.c index 9543ae825..b1c5d2d3c 100644 --- a/zlib/zutil.c +++ b/zlib/zutil.c @@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = { }; -const char * ZEXPORT zlibVersion() -{ +const char * ZEXPORT zlibVersion(void) { return ZLIB_VERSION; } -uLong ZEXPORT zlibCompileFlags() -{ +uLong ZEXPORT zlibCompileFlags(void) { uLong flags; flags = 0; @@ -121,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags() # endif int ZLIB_INTERNAL z_verbose = verbose; -void ZLIB_INTERNAL z_error(m) - char *m; -{ +void ZLIB_INTERNAL z_error(char *m) { fprintf(stderr, "%s\n", m); exit(1); } @@ -132,9 +128,7 @@ void ZLIB_INTERNAL z_error(m) /* exported to allow conversion of error code to string for compress() and * uncompress() */ -const char * ZEXPORT zError(err) - int err; -{ +const char * ZEXPORT zError(int err) { return ERR_MSG(err); } @@ -148,22 +142,14 @@ const char * ZEXPORT zError(err) #ifndef HAVE_MEMCPY -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ +void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ +int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) { uInt j; for (j = 0; j < len; j++) { @@ -172,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len) return 0; } -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ +void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ @@ -216,8 +199,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; @@ -242,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) return buf; } -void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { int n; (void)opaque; @@ -279,14 +260,12 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } -void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); } @@ -299,25 +278,18 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); +extern voidp malloc(uInt size); +extern voidp calloc(uInt items, uInt size); +extern void free(voidpf ptr); #endif -voidpf ZLIB_INTERNAL zcalloc(opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } -void ZLIB_INTERNAL zcfree(opaque, ptr) - voidpf opaque; - voidpf ptr; -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; free(ptr); } diff --git a/zlib/zutil.h b/zlib/zutil.h index 0bc7f4ecd..48dd7feba 100644 --- a/zlib/zutil.h +++ b/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -56,7 +56,7 @@ typedef unsigned long ulg; extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) @@ -137,17 +137,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#if defined(MACOS) || defined(TARGET_OS_MAC) +#if defined(MACOS) # define OS_CODE 7 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif #endif #ifdef __acorn @@ -170,18 +161,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define OS_CODE 19 #endif -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 @@ -191,9 +170,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* provide prototypes for these when building zlib without LFS */ #if !defined(_WIN32) && \ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); #endif /* common defaults */ @@ -232,16 +211,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); + void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len); + int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len); + void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len); #endif /* Diagnostic functions */ #ifdef ZLIB_DEBUG # include extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); + extern void ZLIB_INTERNAL z_error(char *m); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -258,9 +237,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif #ifndef Z_SOLO - voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); - void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); + voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, + unsigned size); + void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr); #endif #define ZALLOC(strm, items, size) \