C3 bindings for miniz, a lossless, high performance data compression library that implements zlib (RFC 1950) and Deflate (RFC 1951).
Add this library to your project's project.json:
{
"dependencies": ["miniz"]
}clone directly into your lib directory:
git clone --recursive https://github.com/user/miniz.c3l lib/miniz.c3limport miniz;
fn void simple_compress_example() {
char[] input = "Hello, World! This text will be compressed.";
// Get max compressed size
MzUlong bound = miniz::mz_compressBound((MzUlong)input.len);
// Compress
char[256] compressed;
MzUlong compressed_len = compressed.len;
if (miniz::mz_compress(&compressed[0], &compressed_len, input.ptr, (MzUlong)input.len) == miniz::MZ_OK) {
// compressed[0..compressed_len] contains compressed data
}
// Decompress
char[256] decompressed;
MzUlong decompressed_len = decompressed.len;
if (miniz::mz_uncompress(&decompressed[0], &decompressed_len, &compressed[0], compressed_len) == miniz::MZ_OK) {
// decompressed[0..decompressed_len] contains original data
}
}import miniz;
import std::core::mem;
fn void stream_compress_example() {
MzStream stream;
mem::clear(&stream, MzStream.sizeof);
// Initialize deflate compressor (level 6 = default)
if (miniz::mz_deflateInit(&stream, miniz::MZ_DEFAULT_LEVEL) != miniz::MZ_OK) {
return;
}
defer miniz::mz_deflateEnd(&stream);
char[] input = "Hello, World!";
char[128] output;
stream.next_in = input.ptr;
stream.avail_in = (uint)input.len;
stream.next_out = &output[0];
stream.avail_out = output.len;
if (miniz::mz_deflate(&stream, miniz::MZ_FINISH) == miniz::MZ_STREAM_END) {
// output[0..stream.total_out] contains compressed data
}
}import miniz;
fn void low_level_example() {
char[] input = "Data to compress";
// Compress to heap (caller must free with mz_free)
usz compressed_len;
int flags = miniz::TDEFL_WRITE_ZLIB_HEADER | miniz::TDEFL_DEFAULT_MAX_PROBES;
void* compressed = miniz::tdefl_compress_mem_to_heap(input.ptr, input.len, &compressed_len, flags);
defer miniz::mz_free(compressed);
// Decompress from heap
usz decompressed_len;
void* decompressed = miniz::tinfl_decompress_mem_to_heap(compressed, compressed_len, &decompressed_len, miniz::TINFL_FLAG_PARSE_ZLIB_HEADER);
defer miniz::mz_free(decompressed);
}Compression Levels:
MZ_NO_COMPRESSION(0) - No compressionMZ_BEST_SPEED(1) - Fastest compressionMZ_DEFAULT_LEVEL(6) - Default compression levelMZ_BEST_COMPRESSION(9) - Best compression ratioMZ_UBER_COMPRESSION(10) - Maximum compression (slower)
Return Codes:
MZ_OK,MZ_STREAM_END,MZ_DATA_ERROR,MZ_MEM_ERROR,MZ_BUF_ERROR, etc.
Checksum Init Values:
MZ_CRC32_INIT(0) - Initial value for CRC-32MZ_ADLER32_INIT(1) - Initial value for Adler-32
mz_compress(dest, dest_len, source, source_len)- Compress in one callmz_compress2(dest, dest_len, source, source_len, level)- Compress with levelmz_uncompress(dest, dest_len, source, source_len)- Decompress in one callmz_compressBound(source_len)- Get max compressed size
mz_deflateInit(stream, level)- Initialize compressormz_deflateInit2(stream, level, method, window_bits, mem_level, strategy)- Initialize with optionsmz_deflate(stream, flush)- Compress datamz_deflateReset(stream)- Reset for reusemz_deflateEnd(stream)- Free resourcesmz_deflateBound(stream, source_len)- Get max compressed size
mz_inflateInit(stream)- Initialize decompressormz_inflateInit2(stream, window_bits)- Initialize with window sizemz_inflate(stream, flush)- Decompress datamz_inflateReset(stream)- Reset for reusemz_inflateEnd(stream)- Free resources
mz_crc32(crc, ptr, len)- Calculate CRC-32mz_adler32(adler, ptr, len)- Calculate Adler-32
tdefl_compress_mem_to_heap(src, src_len, out_len, flags)- Compress to malloc'd buffertdefl_compress_mem_to_mem(out, out_len, src, src_len, flags)- Compress to fixed buffertdefl_compressor_alloc()/tdefl_compressor_free(comp)- Allocate/free compressor
Flags: TDEFL_WRITE_ZLIB_HEADER, TDEFL_COMPUTE_ADLER32, TDEFL_DEFAULT_MAX_PROBES, etc.
tinfl_decompress_mem_to_heap(src, src_len, out_len, flags)- Decompress to malloc'd buffertinfl_decompress_mem_to_mem(out, out_len, src, src_len, flags)- Decompress to fixed buffertinfl_decompressor_alloc()/tinfl_decompressor_free(decomp)- Allocate/free decompressor
Flags: TINFL_FLAG_PARSE_ZLIB_HEADER, TINFL_FLAG_COMPUTE_ADLER32, etc.
Types:
MzZipArchive- Main archive structMzZipArchiveFileStat- File metadata (filename, sizes, CRC, etc.)
Reader Init/End:
mz_zip_zero_struct(zip)- Clear struct before use (required!)mz_zip_reader_init_mem(zip, mem, size, flags)- From memory buffermz_zip_reader_init_file(zip, filename, flags)- From filemz_zip_reader_end(zip)- Free resources
Query:
mz_zip_reader_get_num_files(zip)- File countmz_zip_reader_get_filename(zip, index, buf, buf_size)- Get filenamemz_zip_reader_locate_file(zip, name, comment, flags)- Find file by namemz_zip_reader_file_stat(zip, index, stat)- Get file metadatamz_zip_reader_is_file_a_directory(zip, index)
Extract:
mz_zip_reader_extract_to_mem(zip, index, buf, buf_size, flags)mz_zip_reader_extract_file_to_mem(zip, filename, buf, buf_size, flags)mz_zip_reader_extract_to_heap(zip, index, size, flags)- Returns malloc'd buffermz_zip_reader_extract_file_to_heap(zip, filename, size, flags)mz_zip_reader_extract_to_file(zip, index, dst_filename, flags)
Writer Init/End:
mz_zip_writer_init_heap(zip, reserve, initial_size)- To memorymz_zip_writer_init_file(zip, filename, reserve)- To filemz_zip_writer_finalize_archive(zip)- Must call before endmz_zip_writer_finalize_heap_archive(zip, buf, size)- Get heap buffermz_zip_writer_end(zip)- Free resources
Add Files:
mz_zip_writer_add_mem(zip, name, buf, size, level_and_flags)mz_zip_writer_add_file(zip, name, src_filename, comment, comment_size, level_and_flags)
Flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH, MZ_ZIP_FLAG_WRITE_ZIP64, etc.
High-Level Helpers:
mz_zip_add_mem_to_archive_file_in_place(filename, name, buf, size, ...)- Append to filemz_zip_extract_archive_file_to_heap(filename, name, size, flags)- Extract single file
mz_version()- Get miniz version stringmz_free(ptr)- Free miniz-allocated memorymz_zip_get_last_error(zip)- Get last ZIP errormz_zip_get_error_string(err)- Error code to stringmz_zip_end(zip)- Universal end (reader or writer)
MIT License - See LICENSE