Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
zip.hpp
Go to the documentation of this file.
1#pragma once
2
3// ZIP archive and GZIP compression utilities via miniz.
4
5#include <string>
6#include <string_view>
7#include <vector>
8#include <cstdint>
9#include <optional>
10
11namespace pulp::runtime {
12
13// ── GZIP compression/decompression ──────────────────────────────────────
14//
15// gzip_compress() emits a real RFC 1952 gzip stream:
16//
17// header(10) || raw deflate || CRC32(little-endian, 4) || ISIZE(little-endian, 4)
18//
19// gzip_decompress() accepts both gzip (RFC 1952, magic 0x1f 0x8b) and zlib
20// (RFC 1950) input. The zlib lane is preserved for backward compatibility
21// with older callers and test fixtures that historically passed zlib-wrapped
22// data through this entry point. Earlier revisions of this API silently
23// produced and consumed zlib streams under a "gzip" name; that asymmetry
24// has been removed — the function now actually handles RFC 1952 gzip.
25
27std::optional<std::vector<uint8_t>> gzip_compress(const uint8_t* data, size_t size,
28 int level = 6);
29
35inline constexpr size_t kDefaultMaxDecompressOutput = 256u * 1024u * 1024u;
36
39std::optional<std::vector<uint8_t>> gzip_decompress(
40 const uint8_t* data, size_t size,
41 size_t max_output = kDefaultMaxDecompressOutput);
42
44std::optional<std::vector<uint8_t>> gzip_compress(std::string_view data, int level = 6);
45
47std::optional<std::string> gzip_decompress_string(const uint8_t* data, size_t size);
48
49// ── Raw deflate compression ─────────────────────────────────────────────
50
52std::optional<std::vector<uint8_t>> deflate_compress(const uint8_t* data, size_t size,
53 int level = 6);
54
56std::optional<std::vector<uint8_t>> deflate_decompress(const uint8_t* data, size_t size);
57
58// ── zlib (RFC 1950) compression ─────────────────────────────────────────
59//
60// zlib_compress emits a real RFC 1950 zlib stream:
61//
62// CMF(1) FLG(1) || raw deflate || Adler32(big-endian, 4)
63//
64// Used for the MIDI-CI 1.2 Property Exchange `zlib+Mcoded7` payload
65// encoding (PE spec §6.3). For symmetry with gzip_compress this
66// emits a self-contained stream; gzip_decompress() already accepts
67// zlib input on the inflate side.
68
70std::optional<std::vector<uint8_t>> zlib_compress(const uint8_t* data, size_t size,
71 int level = 6);
72
76std::optional<std::vector<uint8_t>> zlib_decompress(
77 const uint8_t* data, size_t size,
78 size_t max_output = kDefaultMaxDecompressOutput);
79
86std::optional<std::string> zlib_decompress_exact(const uint8_t* data, size_t size,
87 size_t expected_size);
88
89} // namespace pulp::runtime
Definition generated_event_source.hpp:33
std::optional< std::string > zlib_decompress_exact(const uint8_t *data, size_t size, size_t expected_size)
Decompress one RFC 1950 zlib stream whose inflated size is known in advance (an embedded asset that r...
std::optional< std::string > gzip_decompress_string(const uint8_t *data, size_t size)
Convenience: decompress a gzip (RFC 1952) or zlib (RFC 1950) stream into a string.
std::optional< std::vector< uint8_t > > zlib_compress(const uint8_t *data, size_t size, int level=6)
Compress data into an RFC 1950 zlib stream.
std::optional< std::vector< uint8_t > > zlib_decompress(const uint8_t *data, size_t size, size_t max_output=kDefaultMaxDecompressOutput)
Decompress exactly one RFC 1950 zlib stream.
std::optional< std::vector< uint8_t > > gzip_decompress(const uint8_t *data, size_t size, size_t max_output=kDefaultMaxDecompressOutput)
Decompress a gzip (RFC 1952) or zlib (RFC 1950) stream.
constexpr size_t kDefaultMaxDecompressOutput
Default ceiling on total decompressed output (bytes).
Definition zip.hpp:35
std::optional< std::vector< uint8_t > > deflate_compress(const uint8_t *data, size_t size, int level=6)
Compress data using raw deflate (no header).
std::optional< std::vector< uint8_t > > deflate_decompress(const uint8_t *data, size_t size)
Decompress raw deflate data.
std::optional< std::vector< uint8_t > > gzip_compress(const uint8_t *data, size_t size, int level=6)
Compress data into an RFC 1952 gzip stream.