chore: Remove miniz and modularise inflation logic (#1073)

## Summary

* Remove miniz and move completely to uzlib
* Move uzlib interfacing to InflateReader to better modularise inflation
code

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? Yes, Claude helped with
the extraction and refactor
This commit is contained in:
Dave Allie
2026-02-22 21:38:03 +11:00
committed by GitHub
parent f28623dacd
commit ecb5b1b4e5
9 changed files with 348 additions and 8626 deletions

View File

@@ -0,0 +1,78 @@
#include "InflateReader.h"
#include <cstring>
#include <type_traits>
namespace {
constexpr size_t INFLATE_DICT_SIZE = 32768;
}
// Guarantee the cast pattern in the header comment is valid.
static_assert(std::is_standard_layout<InflateReader>::value,
"InflateReader must be standard-layout for the uzlib callback cast to work");
InflateReader::~InflateReader() { deinit(); }
bool InflateReader::init(const bool streaming) {
deinit(); // free any previously allocated ring buffer and reset state
if (streaming) {
ringBuffer = static_cast<uint8_t*>(malloc(INFLATE_DICT_SIZE));
if (!ringBuffer) return false;
memset(ringBuffer, 0, INFLATE_DICT_SIZE);
}
uzlib_uncompress_init(&decomp, ringBuffer, ringBuffer ? INFLATE_DICT_SIZE : 0);
return true;
}
void InflateReader::deinit() {
if (ringBuffer) {
free(ringBuffer);
ringBuffer = nullptr;
}
memset(&decomp, 0, sizeof(decomp));
}
void InflateReader::setSource(const uint8_t* src, size_t len) {
decomp.source = src;
decomp.source_limit = src + len;
}
void InflateReader::setReadCallback(int (*cb)(struct uzlib_uncomp*)) { decomp.source_read_cb = cb; }
void InflateReader::skipZlibHeader() {
uzlib_get_byte(&decomp);
uzlib_get_byte(&decomp);
}
bool InflateReader::read(uint8_t* dest, size_t len) {
if (!ringBuffer) {
// One-shot mode: back-references use absolute offset from dest_start.
// Valid only when read() is called once with the full output buffer.
decomp.dest_start = dest;
}
decomp.dest = dest;
decomp.dest_limit = dest + len;
const int res = uzlib_uncompress(&decomp);
if (res < 0) return false;
return decomp.dest == decomp.dest_limit;
}
InflateStatus InflateReader::readAtMost(uint8_t* dest, size_t maxLen, size_t* produced) {
if (!ringBuffer) {
// One-shot mode: back-references use absolute offset from dest_start.
// Valid only when readAtMost() is called once with the full output buffer.
decomp.dest_start = dest;
}
decomp.dest = dest;
decomp.dest_limit = dest + maxLen;
const int res = uzlib_uncompress(&decomp);
*produced = static_cast<size_t>(decomp.dest - dest);
if (res == TINF_DONE) return InflateStatus::Done;
if (res < 0) return InflateStatus::Error;
return InflateStatus::Ok;
}