| 1 | module lz |
| 2 | |
| 3 | // Format identifies which LZ-family codec variant to use. |
| 4 | pub enum Format { |
| 5 | lz77 |
| 6 | lz78 |
| 7 | lzw |
| 8 | lz4 |
| 9 | lzss |
| 10 | lzma |
| 11 | lzma2 |
| 12 | lzjb |
| 13 | } |
| 14 | |
| 15 | // format_from_string parses a case-insensitive format name. |
| 16 | pub fn format_from_string(name string) !Format { |
| 17 | key := name.to_lower() |
| 18 | return match key { |
| 19 | 'lz77' { .lz77 } |
| 20 | 'lz78' { .lz78 } |
| 21 | 'lzw' { .lzw } |
| 22 | 'lz4' { .lz4 } |
| 23 | 'lzss' { .lzss } |
| 24 | 'lzma' { .lzma } |
| 25 | 'lzma2' { .lzma2 } |
| 26 | 'lzjb' { .lzjb } |
| 27 | else { return error('unknown lz format: ${name}') } |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | // compress compresses data with the selected LZ format. |
| 32 | pub fn compress(data []u8, format Format) ![]u8 { |
| 33 | return match format { |
| 34 | .lz77 { compress_lz77(data) } |
| 35 | .lz78 { compress_lz78(data) } |
| 36 | .lzw { compress_lzw(data) } |
| 37 | .lz4 { compress_lz4(data) } |
| 38 | .lzss { compress_lzss(data) } |
| 39 | .lzma { compress_lzma(data) } |
| 40 | .lzma2 { compress_lzma2(data) } |
| 41 | .lzjb { compress_lzjb(data) } |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | // decompress decompresses data with the selected LZ format. |
| 46 | pub fn decompress(data []u8, format Format) ![]u8 { |
| 47 | return match format { |
| 48 | .lz77 { decompress_lz77(data) } |
| 49 | .lz78 { decompress_lz78(data) } |
| 50 | .lzw { decompress_lzw(data) } |
| 51 | .lz4 { decompress_lz4(data) } |
| 52 | .lzss { decompress_lzss(data) } |
| 53 | .lzma { decompress_lzma(data) } |
| 54 | .lzma2 { decompress_lzma2(data) } |
| 55 | .lzjb { decompress_lzjb(data) } |
| 56 | } |
| 57 | } |
| 58 | |