Skip to content

compress.deflate #

Description

compress.deflate is a pure V RFC-compliant DEFLATE module.

Compression output format is selected by CompressFormat via compress(data, format: ...):

  • .zlib (RFC 1950 wrapper)
  • .gzip (RFC 1952 wrapper)
  • .raw_deflate (RFC 1951 raw stream)

compress keeps default zlib behavior, and decompress auto-detects all three.

Interop Validation

Cross-validation with C/zlib is kept separate from v test and can be run manually:

./vnew run vlib/compress/deflate/interop/deflate_interop.v

Example

import compress.deflate

fn main() {
    uncompressed := 'Hello world!'
    zlib_stream := deflate.compress(uncompressed.bytes())!
    gzip_stream := deflate.compress(uncompressed.bytes(), format: .gzip)!
    raw_stream := deflate.compress(uncompressed.bytes(), format: .raw_deflate)!
    assert deflate.decompress(zlib_stream)! == uncompressed.bytes()
    assert deflate.decompress(gzip_stream)! == uncompressed.bytes()
    decompressed := deflate.decompress(raw_stream)!
    assert decompressed == uncompressed.bytes()
}

fn compress #

fn compress(data []u8, format CompressParams) ![]u8

compress compresses data as zlib, gzip, or raw DEFLATE.

fn compress_gzip #

fn compress_gzip(data []u8) ![]u8

compress_gzip compresses data into a gzip stream (RFC 1952).

fn compress_raw #

fn compress_raw(data []u8) ![]u8

compress_raw compresses data to a raw RFC 1951 DEFLATE stream.

fn compress_zlib #

fn compress_zlib(data []u8) ![]u8

fn decompress #

fn decompress(data []u8) ![]u8

decompress decompresses a zlib (RFC 1950), gzip (RFC 1952), or raw DEFLATE (RFC 1951) stream. The format is auto-detected.

fn decompress_gzip #

fn decompress_gzip(data []u8) ![]u8

decompress_gzip decompresses a gzip stream (RFC 1952). It returns the decompressed bytes in a new array.

fn decompress_raw_with_consumed #

fn decompress_raw_with_consumed(data []u8) !RawInflateResult

decompress_raw_with_consumed decompresses raw RFC 1951 DEFLATE data and tracks consumed bytes.

fn decompress_with_callback #

fn decompress_with_callback(data []u8, cb ChunkCallback, userdata voidptr) !int

decompress_with_callback decompresses a zlib/gzip/raw stream (RFC 1950, RFC 1952) using a callback for chunked delivery. The callback receives chunks of decompressed data and should return the chunk length to continue, or 0 to abort. Returns the total decompressed length.

fn decompress_zlib #

fn decompress_zlib(data []u8) ![]u8

decompress_zlib decompresses a zlib stream (RFC 1950). It returns the decompressed bytes in a new array.

fn validate_gzip_header #

fn validate_gzip_header(data []u8) !GzipHeader

validate_gzip_header validates a RFC 1952 gzip header and returns parsed fields.

fn validate_zlib_header #

fn validate_zlib_header(data []u8) !ZlibHeader

validate_zlib_header validates a RFC 1950 zlib header.

fn CompressFormat.from #

fn CompressFormat.from[W](input W) !CompressFormat

type ChunkCallback #

type ChunkCallback = fn (chunk []u8, userdata voidptr) int

enum CompressFormat #

enum CompressFormat {
	zlib
	gzip
	raw_deflate
}

CompressFormat selects the output container around the RFC 1951 payload.

struct CompressParams #

@[params]
struct CompressParams {
pub:
	format CompressFormat = .zlib
}

struct GzipHeader #

struct GzipHeader {
pub mut:
	flags             u8
	payload_start     int
	extra             []u8
	filename          []u8
	comment           []u8
	modification_time u32
	operating_system  u8
}

struct RawInflateResult #

struct RawInflateResult {
pub:
	decoded  []u8
	consumed int
}

struct ZlibHeader #

struct ZlibHeader {
pub:
	payload_start int = 2
}