From 6cafb40142fca520cc21eb213dab2bc08b545e8d Mon Sep 17 00:00:00 2001 From: JalonSolov Date: Tue, 12 May 2026 14:21:27 -0400 Subject: [PATCH] lz: add lzma2 variation (#27145) * lz: add lzma2 variation * add lzma2 to interop --- vlib/compress/lz/README.md | 1 + vlib/compress/lz/interop/lz_interop.v | 2 +- vlib/compress/lz/lz.v | 4 ++++ vlib/compress/lz/lz_test.v | 7 +++++-- vlib/compress/lz/lzma2.v | 18 ++++++++++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 vlib/compress/lz/lzma2.v diff --git a/vlib/compress/lz/README.md b/vlib/compress/lz/README.md index c4b1d0667..a13bde0b0 100644 --- a/vlib/compress/lz/README.md +++ b/vlib/compress/lz/README.md @@ -10,6 +10,7 @@ Supported formats: - `lz4` - `lzss` - `lzma` +- `lzma2` - `lzjb` Use the generic API when selecting a format dynamically: diff --git a/vlib/compress/lz/interop/lz_interop.v b/vlib/compress/lz/interop/lz_interop.v index 5c010d08f..3d02a1384 100644 --- a/vlib/compress/lz/interop/lz_interop.v +++ b/vlib/compress/lz/interop/lz_interop.v @@ -17,7 +17,7 @@ fn main() { println('LZ interop input: ${data.len} bytes') - for format in [lz.Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzjb] { + for format in [lz.Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzma2, .lzjb] { validate_v_roundtrip(data, format) or { eprintln('V validation failed for ${format}: ${err.msg()}') exit(1) diff --git a/vlib/compress/lz/lz.v b/vlib/compress/lz/lz.v index cd9c44135..8bddee6fb 100644 --- a/vlib/compress/lz/lz.v +++ b/vlib/compress/lz/lz.v @@ -8,6 +8,7 @@ pub enum Format { lz4 lzss lzma + lzma2 lzjb } @@ -21,6 +22,7 @@ pub fn format_from_string(name string) !Format { 'lz4' { .lz4 } 'lzss' { .lzss } 'lzma' { .lzma } + 'lzma2' { .lzma2 } 'lzjb' { .lzjb } else { return error('unknown lz format: ${name}') } } @@ -35,6 +37,7 @@ pub fn compress(data []u8, format Format) ![]u8 { .lz4 { compress_lz4(data) } .lzss { compress_lzss(data) } .lzma { compress_lzma(data) } + .lzma2 { compress_lzma2(data) } .lzjb { compress_lzjb(data) } } } @@ -48,6 +51,7 @@ pub fn decompress(data []u8, format Format) ![]u8 { .lz4 { decompress_lz4(data) } .lzss { decompress_lzss(data) } .lzma { decompress_lzma(data) } + .lzma2 { decompress_lzma2(data) } .lzjb { decompress_lzjb(data) } } } diff --git a/vlib/compress/lz/lz_test.v b/vlib/compress/lz/lz_test.v index 577d9abc3..f30df8c13 100644 --- a/vlib/compress/lz/lz_test.v +++ b/vlib/compress/lz/lz_test.v @@ -4,7 +4,7 @@ const sample_data = ('The quick brown fox jumps over the lazy dog. '.repeat(12) 'aaaaaaaaabbbbbbbbbcccccccccdddddddddeeeeeeeee').bytes() fn test_roundtrip_all_formats() { - formats := [Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzjb] + formats := [Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzma2, .lzjb] for format in formats { compressed := compress(sample_data, format)! decompressed := decompress(compressed, format)! @@ -31,6 +31,9 @@ fn test_format_specific_api_roundtrip() { lzma_data := compress_lzma(sample_data)! assert decompress_lzma(lzma_data)! == sample_data + lzma2_data := compress_lzma2(sample_data)! + assert decompress_lzma2(lzma2_data)! == sample_data + lzjb_data := compress_lzjb(sample_data)! assert decompress_lzjb(lzjb_data)! == sample_data } @@ -82,7 +85,7 @@ fn test_high_entropy_roundtrip_large_window_formats() { data[i] = u8(state >> 24) } - for format in [Format.lz4, .lzma] { + for format in [Format.lz4, .lzma, .lzma2] { compressed := compress(data, format)! decompressed := decompress(compressed, format)! assert decompressed == data diff --git a/vlib/compress/lz/lzma2.v b/vlib/compress/lz/lzma2.v new file mode 100644 index 000000000..cd3c794db --- /dev/null +++ b/vlib/compress/lz/lzma2.v @@ -0,0 +1,18 @@ +module lz + +const lzma2_profile = MatchProfile{ + window: 65535 + min_match: 3 + max_match: 130 + max_literal: 128 +} + +// compress_lzma2 compresses data using a pure-V LZMA2-like stream. +pub fn compress_lzma2(data []u8) ![]u8 { + return compress_with_profile(data, lzma2_profile, .lzma2) +} + +// decompress_lzma2 decompresses data produced by compress_lzma2. +pub fn decompress_lzma2(data []u8) ![]u8 { + return decompress_with_profile(data, lzma2_profile, .lzma2) +} -- 2.39.5