summaryrefslogtreecommitdiff
path: root/docs/handbook/archived/ptlibzippy.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/handbook/archived/ptlibzippy.md')
-rw-r--r--docs/handbook/archived/ptlibzippy.md501
1 files changed, 501 insertions, 0 deletions
diff --git a/docs/handbook/archived/ptlibzippy.md b/docs/handbook/archived/ptlibzippy.md
new file mode 100644
index 0000000000..21ad2d6ce1
--- /dev/null
+++ b/docs/handbook/archived/ptlibzippy.md
@@ -0,0 +1,501 @@
+# PTlibzippy
+
+## Overview
+
+PTlibzippy is a Project Tick fork of the [zlib](https://zlib.net/) data compression library.
+It is a general-purpose lossless data compression library implementing the DEFLATE algorithm
+as specified in RFCs 1950 (zlib format), 1951 (deflate format), and 1952 (gzip format).
+
+PTlibzippy was version 0.0.5.1 and was maintained as a detached fork to solve symbol
+conflicts when bundling zlib alongside libpng in the ProjT Launcher's build system.
+
+**Status**: Archived — system zlib is now used instead of a bundled fork.
+
+---
+
+## Project Identity
+
+| Property | Value |
+|-------------------|----------------------------------------------------------|
+| **Name** | PTlibzippy |
+| **Location** | `archived/ptlibzippy/` |
+| **Language** | C |
+| **Version** | 0.0.5.1 |
+| **License** | zlib license (permissive) |
+| **Copyright** | 1995–2026 Jean-loup Gailly and Mark Adler; 2026 Project Tick |
+| **Homepage** | https://projecttick.org/p/zlib |
+| **FAQ** | https://projecttick.org/p/zlib/zlib_faq.html |
+| **Contact** | community@community.projecttick.org |
+
+---
+
+## Why a zlib Fork?
+
+The fork was created to solve a specific technical problem in the ProjT Launcher:
+
+### The Symbol Conflict Problem
+
+When the launcher bundled both zlib and libpng as static libraries, the linker
+encountered duplicate symbol definitions. Both zlib and libpng's internal zlib
+usage exported identical function names (e.g., `deflate`, `inflate`, `compress`),
+causing link-time errors or runtime symbol resolution ambiguities.
+
+### The Solution
+
+PTlibzippy addressed this through:
+
+1. **Symbol prefixing** — The `PTLIBZIPPY_PREFIX` CMake option enables renaming all
+ public symbols with a custom prefix, preventing collisions
+2. **PNG shim layer** — A custom `ptlibzippy_pngshim.c` file provided a compatibility
+ layer between the renamed zlib symbols and libpng's expectations
+3. **Custom header names** — Headers were renamed (`ptlibzippy.h`, `ptzippyconf.h`,
+ `ptzippyguts.h`, `ptzippyutil.h`) to avoid include-path conflicts
+
+As noted in the ProjT Launcher changelog:
+> "zlib symbol handling was refined to use libpng-targeted shim overrides instead
+> of global prefixing."
+
+---
+
+## License
+
+The zlib license is permissive and compatible with GPL:
+
+```
+Copyright notice:
+
+ (C) 1995-2026 Jean-loup Gailly and Mark Adler
+ (C) 2026 Project Tick
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+```
+
+---
+
+## Build System
+
+PTlibzippy supported three build systems:
+
+### CMake (Primary)
+
+```cmake
+cmake_minimum_required(VERSION 3.12...3.31)
+
+project(
+ PTlibzippy
+ LANGUAGES C
+ VERSION 0.0.5.1
+ HOMEPAGE_URL "https://projecttick.org/p/zlib"
+ DESCRIPTION "PTlibzippy - a general-purpose lossless data-compression library")
+```
+
+#### CMake Options
+
+| Option | Default | Description |
+|---------------------------|---------|----------------------------------------------|
+| `PTLIBZIPPY_BUILD_TESTING`| `ON` | Enable building test programs |
+| `PTLIBZIPPY_BUILD_SHARED` | `ON` | Build shared library (`libptlibzippy.so`) |
+| `PTLIBZIPPY_BUILD_STATIC` | `ON` | Build static library (`libptlibzippystatic.a`)|
+| `PTLIBZIPPY_INSTALL` | `ON` | Enable `make install` target |
+| `PTLIBZIPPY_PREFIX` | `OFF` | Enable symbol prefixing for all public APIs |
+
+#### Feature Detection
+
+The CMake build detected platform capabilities:
+
+```cmake
+check_type_size(off64_t OFF64_T) # Large file support
+check_function_exists(fseeko HAVE_FSEEKO) # POSIX fseeko
+check_include_file(stdarg.h HAVE_STDARG_H)
+check_include_file(unistd.h HAVE_UNISTD_H)
+```
+
+And generated `ptzippyconf.h` with the results:
+
+```cmake
+configure_file(${PTlibzippy_BINARY_DIR}/ptzippyconf.h.cmakein
+ ${PTlibzippy_BINARY_DIR}/ptzippyconf.h)
+```
+
+#### Visibility Attributes
+
+On non-Windows platforms, the build checked for GCC visibility attributes:
+
+```c
+void f(void) __attribute__ ((visibility("hidden")));
+```
+
+This enabled hiding internal symbols from the shared library's public API.
+
+#### Library Targets
+
+**Shared library:**
+
+```cmake
+add_library(ptlibzippy SHARED ${PTLIBZIPPY_SRCS} ...)
+add_library(PTlibzippy::PTlibzippy ALIAS ptlibzippy)
+
+target_compile_definitions(ptlibzippy
+ PRIVATE PTLIBZIPPY_BUILD PTLIBZIPPY_INTERNAL= ...)
+```
+
+**Static library:**
+
+```cmake
+add_library(ptlibzippystatic STATIC ${PTLIBZIPPY_SRCS} ...)
+```
+
+On Windows, the static library gets a `"s"` suffix to distinguish from the import library.
+
+#### pkg-config
+
+A `ptlibzippy.pc` file was generated for pkg-config integration:
+
+```cmake
+configure_file(${PTlibzippy_SOURCE_DIR}/ptlibzippy.pc.cmakein
+ ${PTLIBZIPPY_PC} @ONLY)
+```
+
+### Autotools
+
+Traditional Unix build:
+
+```bash
+./configure
+make
+make test
+make install
+```
+
+### Bazel
+
+```
+BUILD.bazel # Build rules
+MODULE.bazel # Module definition
+```
+
+---
+
+## Source Files
+
+### Public Headers
+
+| Header | Purpose |
+|----------------|----------------------------------------------------|
+| `ptlibzippy.h` | Public API (compress, decompress, gzip, etc.) |
+| `ptzippyconf.h`| Configuration header (generated at build time) |
+
+### Private Headers
+
+| Header | Purpose |
+|----------------|----------------------------------------------------|
+| `crc32.h` | CRC-32 lookup tables |
+| `deflate.h` | DEFLATE compression state machine |
+| `ptzippyguts.h` | Internal definitions (gzip state) |
+| `inffast.h` | Fast inflate inner loop |
+| `inffixed.h` | Fixed Huffman code tables |
+| `inflate.h` | Inflate state machine |
+| `inftrees.h` | Huffman tree building |
+| `trees.h` | Dynamic Huffman tree encoding |
+| `ptzippyutil.h` | System-level utilities |
+
+### Source Files
+
+| Source | Purpose |
+|-------------------------|-----------------------------------------------|
+| `adler32.c` | Adler-32 checksum computation |
+| `compress.c` | Compression convenience API |
+| `crc32.c` | CRC-32 checksum computation |
+| `deflate.c` | DEFLATE compression algorithm |
+| `gzclose.c` | gzip file close |
+| `gzlib.c` | gzip file utility functions |
+| `gzread.c` | gzip file reading |
+| `gzwrite.c` | gzip file writing |
+| `inflate.c` | DEFLATE decompression algorithm |
+| `infback.c` | Inflate using a callback interface |
+| `inftrees.c` | Generate Huffman trees for inflate |
+| `inffast.c` | Fast inner loop for inflate |
+| `ptlibzippy_pngshim.c` | PNG integration shim (Project Tick addition) |
+| `trees.c` | Output compressed data using Huffman coding |
+| `uncompr.c` | Decompression convenience API |
+| `ptzippyutil.c` | Operating system interface utilities |
+
+### Project Tick Additions
+
+The following files were added or renamed by Project Tick (not present in upstream zlib):
+
+| File | Change Type | Purpose |
+|-------------------------|-------------|--------------------------------------|
+| `ptlibzippy_pngshim.c` | Added | Shim for libpng symbol compatibility |
+| `ptzippyguts.h` | Renamed | From `gzguts.h` |
+| `ptzippyutil.c` | Renamed | From `zutil.c` |
+| `ptzippyutil.h` | Renamed | From `zutil.h` |
+| `ptzippyconf.h` | Renamed | From `zconf.h` |
+| `ptlibzippy.h` | Renamed | From `zlib.h` |
+| `ptlibzippy.pc.cmakein` | Renamed | From `zlib.pc.cmakein` |
+| `COPYING.md` | Modified | Added Project Tick copyright |
+
+---
+
+## Symbol Prefixing
+
+The `PTLIBZIPPY_PREFIX` option enables symbol prefixing for all public API functions.
+When enabled, all zlib functions are prefixed to avoid collisions:
+
+| Original Symbol | Prefixed Symbol (example) |
+|----------------|---------------------------|
+| `deflate` | `pt_deflate` |
+| `inflate` | `pt_inflate` |
+| `compress` | `pt_compress` |
+| `uncompress` | `pt_uncompress` |
+| `crc32` | `pt_crc32` |
+| `adler32` | `pt_adler32` |
+
+The prefix is configured through `ptzippyconf.h`:
+
+```cmake
+set(PT_PREFIX ${PTLIBZIPPY_PREFIX})
+file(APPEND ${PTCONF_OUT_FILE} "#cmakedefine PT_PREFIX 1\n")
+```
+
+---
+
+## PNG Shim Layer
+
+The `ptlibzippy_pngshim.c` file was the key Project Tick addition. It provided a
+compatibility layer that allowed libpng to use PTlibzippy's renamed symbols
+transparently.
+
+Without the shim, libpng would look for standard zlib function names (`deflate`,
+`inflate`, etc.) and fail to link against PTlibzippy's prefixed versions.
+
+The shim worked by:
+1. Including PTlibzippy's headers (with prefixed symbols)
+2. Providing wrapper functions with the original zlib names
+3. Each wrapper forwarded to the corresponding PTlibzippy function
+
+This approach was described in the changelog as:
+> "zlib symbol handling was refined to use libpng-targeted shim overrides instead
+> of global prefixing"
+
+---
+
+## Cross-Platform Support
+
+PTlibzippy inherited zlib's extensive platform support:
+
+| Platform | Build System | Notes |
+|------------------|-------------------------------|-------------------------------|
+| Linux | CMake, Autotools, Makefile | Primary development platform |
+| macOS | CMake, Autotools | |
+| Windows | CMake, NMake, MSVC | DLL and static library |
+| Windows (MinGW) | CMake, Makefile | |
+| Cygwin | CMake, Autotools | DLL naming handled |
+| Amiga | Makefile.pup, Makefile.sas | SAS/C compiler |
+| OS/400 | Custom makefiles | IBM i (formerly AS/400) |
+| QNX | Custom makefiles | QNX Neutrino |
+| VMS | make_vms.com | OpenVMS command procedure |
+
+### Platform-Specific Notes from README
+
+- **64-bit Irix**: `deflate.c` must be compiled without optimization with `-O`
+- **Digital Unix 4.0D**: Requires `cc -std1` for correct `gzprintf` behavior
+- **HP-UX 9.05**: Some versions of `/bin/cc` are incompatible
+- **PalmOS**: Supported via external port (https://palmzlib.sourceforge.net/)
+
+---
+
+## Third-Party Contributions
+
+The `contrib/` directory contained community-contributed extensions:
+
+| Directory | Description |
+|----------------|------------------------------------------------|
+| `contrib/ada/` | Ada programming language bindings |
+| `contrib/blast/`| PKWare Data Compression Library decompressor |
+| `contrib/crc32vx/`| Vectorized CRC-32 for IBM z/Architecture |
+| `contrib/delphi/`| Borland Delphi bindings |
+| `contrib/dotzlib/`| .NET (C#) bindings |
+| `contrib/gcc_gvmat64/`| x86-64 assembly optimizations |
+
+Ada bindings included full package specifications:
+
+```
+contrib/ada/ptlib.ads # Package spec
+contrib/ada/ptlib.adb # Package body
+contrib/ada/ptlib-thin.ads # Thin binding spec
+contrib/ada/ptlib-thin.adb # Thin binding body
+contrib/ada/ptlib-streams.ads # Stream interface spec
+contrib/ada/ptlib-streams.adb # Stream interface body
+```
+
+---
+
+## FAQ Highlights
+
+From the project FAQ:
+
+**Q: Is PTlibzippy Y2K-compliant?**
+A: Yes. PTlibzippy doesn't handle dates.
+
+**Q: Can zlib handle .zip archives?**
+A: Not by itself. See `contrib/minizip`.
+
+**Q: Can zlib handle .Z files?**
+A: No. Use `uncompress` or `gunzip` subprocess.
+
+**Q: How can I make a Unix shared library?**
+A: Default build produces shared + static libraries:
+```bash
+make distclean
+./configure
+make
+```
+
+---
+
+## Language Bindings
+
+PTlibzippy (and its zlib base) was accessible from many languages:
+
+| Language | Interface |
+|----------|---------------------------------------------------|
+| C | Native API via `ptlibzippy.h` |
+| C++ | Direct C API usage |
+| Ada | `contrib/ada/` bindings |
+| C# (.NET)| `contrib/dotzlib/` bindings |
+| Delphi | `contrib/delphi/` bindings |
+| Java | `java.util.zip` package (JDK built-in) |
+| Perl | IO::Compress module |
+| Python | `zlib` module (Python standard library) |
+| Tcl | Built-in zlib support |
+
+---
+
+## Integration with ProjT Launcher
+
+In the ProjT Launcher's CMake build, PTlibzippy was used via:
+
+```cmake
+# From cmake/usePTlibzippy.cmake (referenced in the launcher's cmake/ directory)
+```
+
+The launcher's `CMakeLists.txt` imported PTlibzippy alongside other compression
+libraries (bzip2, quazip) to handle:
+
+- Mod archive extraction (`.zip`, `.jar` files)
+- Instance backup/restore
+- Asset pack handling
+- Modpack import/export (Modrinth `.mrpack`, CurseForge `.zip` formats)
+
+---
+
+## Why It Was Archived
+
+PTlibzippy was archived when:
+
+1. **Symbol conflict resolution matured** — The launcher's build system evolved to
+ handle zlib/libpng coexistence without a custom fork
+2. **System zlib preferred** — Using the system's zlib package reduced maintenance
+ burden and ensured security patches were applied promptly
+3. **Launcher archived** — When ProjT Launcher was archived, its dependency libraries
+ (including PTlibzippy) were archived alongside it
+4. **MeshMC approach** — The successor launcher (MeshMC) uses system libraries or
+ vendored sources with different conflict resolution strategies
+
+---
+
+## Building (for Reference)
+
+### CMake
+
+```bash
+cd archived/ptlibzippy/
+mkdir build && cd build
+cmake ..
+make
+make test
+```
+
+### With Symbol Prefixing
+
+```bash
+cmake .. -DPTLIBZIPPY_PREFIX=pt_
+make
+```
+
+### Autotools
+
+```bash
+cd archived/ptlibzippy/
+./configure
+make
+make test
+make install
+```
+
+### Static-Only Build
+
+```bash
+cmake .. -DPTLIBZIPPY_BUILD_SHARED=OFF
+make
+```
+
+Note: Build success is not guaranteed since the archived code is not maintained.
+
+---
+
+## File Index
+
+From the project `INDEX` file:
+
+```
+CMakeLists.txt cmake build file
+ChangeLog history of changes
+FAQ Frequently Asked Questions about zlib
+INDEX file listing
+Makefile dummy Makefile that tells you to ./configure
+Makefile.in template for Unix Makefile
+README project overview
+configure configure script for Unix
+make_vms.com makefile for VMS
+test/example.c zlib usage examples for build testing
+test/minigzip.c minimal gzip-like functionality for build testing
+test/infcover.c inf*.c code coverage for build coverage testing
+treebuild.xml XML description of source file dependencies
+ptzippyconf.h zlib configuration header (template)
+ptlibzippy.h zlib public API header
+
+amiga/ makefiles for Amiga SAS C
+doc/ documentation for formats and algorithms
+msdos/ makefiles for MSDOS
+old/ legacy makefiles and documentation
+os400/ makefiles for OS/400
+qnx/ makefiles for QNX
+watcom/ makefiles for OpenWatcom
+win32/ makefiles for Windows
+```
+
+---
+
+## Ownership
+
+Maintained by `@YongDo-Hyun` as defined in `ci/OWNERS`:
+
+```
+/archived/ptlibzippy/ @YongDo-Hyun
+```