Skip to content

Commit 223ea88

Browse files
committed
lz: add lzma2 variation
1 parent ad0e4c9 commit 223ea88

4 files changed

Lines changed: 28 additions & 2 deletions

File tree

vlib/compress/lz/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Supported formats:
1010
- `lz4`
1111
- `lzss`
1212
- `lzma`
13+
- `lzma2`
1314
- `lzjb`
1415

1516
Use the generic API when selecting a format dynamically:

vlib/compress/lz/lz.v

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub enum Format {
88
lz4
99
lzss
1010
lzma
11+
lzma2
1112
lzjb
1213
}
1314

@@ -21,6 +22,7 @@ pub fn format_from_string(name string) !Format {
2122
'lz4' { .lz4 }
2223
'lzss' { .lzss }
2324
'lzma' { .lzma }
25+
'lzma2' { .lzma2 }
2426
'lzjb' { .lzjb }
2527
else { return error('unknown lz format: ${name}') }
2628
}
@@ -35,6 +37,7 @@ pub fn compress(data []u8, format Format) ![]u8 {
3537
.lz4 { compress_lz4(data) }
3638
.lzss { compress_lzss(data) }
3739
.lzma { compress_lzma(data) }
40+
.lzma2 { compress_lzma2(data) }
3841
.lzjb { compress_lzjb(data) }
3942
}
4043
}
@@ -48,6 +51,7 @@ pub fn decompress(data []u8, format Format) ![]u8 {
4851
.lz4 { decompress_lz4(data) }
4952
.lzss { decompress_lzss(data) }
5053
.lzma { decompress_lzma(data) }
54+
.lzma2 { decompress_lzma2(data) }
5155
.lzjb { decompress_lzjb(data) }
5256
}
5357
}

vlib/compress/lz/lz_test.v

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const sample_data = ('The quick brown fox jumps over the lazy dog. '.repeat(12)
44
'aaaaaaaaabbbbbbbbbcccccccccdddddddddeeeeeeeee').bytes()
55

66
fn test_roundtrip_all_formats() {
7-
formats := [Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzjb]
7+
formats := [Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzma2, .lzjb]
88
for format in formats {
99
compressed := compress(sample_data, format)!
1010
decompressed := decompress(compressed, format)!
@@ -31,6 +31,9 @@ fn test_format_specific_api_roundtrip() {
3131
lzma_data := compress_lzma(sample_data)!
3232
assert decompress_lzma(lzma_data)! == sample_data
3333

34+
lzma2_data := compress_lzma2(sample_data)!
35+
assert decompress_lzma2(lzma2_data)! == sample_data
36+
3437
lzjb_data := compress_lzjb(sample_data)!
3538
assert decompress_lzjb(lzjb_data)! == sample_data
3639
}
@@ -82,7 +85,7 @@ fn test_high_entropy_roundtrip_large_window_formats() {
8285
data[i] = u8(state >> 24)
8386
}
8487

85-
for format in [Format.lz4, .lzma] {
88+
for format in [Format.lz4, .lzma, .lzma2] {
8689
compressed := compress(data, format)!
8790
decompressed := decompress(compressed, format)!
8891
assert decompressed == data

vlib/compress/lz/lzma2.v

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module lz
2+
3+
const lzma2_profile = MatchProfile{
4+
window: 65535
5+
min_match: 3
6+
max_match: 130
7+
max_literal: 128
8+
}
9+
10+
// compress_lzma2 compresses data using a pure-V LZMA2-like stream.
11+
pub fn compress_lzma2(data []u8) ![]u8 {
12+
return compress_with_profile(data, lzma2_profile, .lzma2)
13+
}
14+
15+
// decompress_lzma2 decompresses data produced by compress_lzma2.
16+
pub fn decompress_lzma2(data []u8) ![]u8 {
17+
return decompress_with_profile(data, lzma2_profile, .lzma2)
18+
}

0 commit comments

Comments
 (0)