v / vlib / compress / gzip / gzip.v
98 lines · 88 sloc · 3.02 KB · 02d9ab594d19c672bbfc9f290201f39697949f7a
Raw
1// [rfc1952](https://datatracker.ietf.org/doc/html/rfc1952) compliant
2// gzip compression/decompression
3
4module gzip
5
6import compress.deflate
7
8// CompressFlags
9@[deprecated: 'never used']
10@[deprecated_after: '2026-07-31']
11@[flag]
12pub enum CompressFlags {
13 // The low 12 bits will be overwritten by `compression_level`
14 compression_level_overwrite_flag01
15 compression_level_overwrite_flag02
16 compression_level_overwrite_flag03
17 compression_level_overwrite_flag04
18 compression_level_overwrite_flag05
19 compression_level_overwrite_flag06
20 compression_level_overwrite_flag07
21 compression_level_overwrite_flag08
22 compression_level_overwrite_flag09
23 compression_level_overwrite_flag10
24 compression_level_overwrite_flag11
25 compression_level_overwrite_flag12
26 write_zlib_header
27 compute_adler32
28 greedy_parsing_flag
29 nondeterministic_parsing_flag
30 rle_matches
31 filter_matches
32 force_all_static_blocks
33 force_all_raw_blocks
34}
35
36// CompressParams set compression_level for compression:
37@[deprecated: 'never used']
38@[deprecated_after: '2026-07-31']
39@[params]
40pub struct CompressParams {
41pub:
42 compression_level int
43 flags CompressFlags
44}
45
46// compress compresses an array of bytes using gzip and returns the compressed bytes in a new array.
47pub fn compress(data []u8) ![]u8 {
48 // Delegate to deflate.compress_gzip() which implements RFC 1952
49 return deflate.compress_gzip(data)
50}
51
52// DecompressFlags
53// N.B.: only retained for API compatibility.
54@[deprecated: 'never used']
55@[deprecated_after: '2026-07-31']
56@[flag]
57pub enum DecompressFlags {
58 parse_zlib_header
59 has_more_input
60 using_non_wrapping_output_buf
61 compute_adler32
62}
63
64// DecompressParams controls gzip decompression behavior.
65// N.B.: only retained for API compatibility.
66@[deprecated: 'never used']
67@[deprecated_after: '2026-07-31']
68@[params]
69pub struct DecompressParams {
70pub:
71 verify_header_checksum bool = true
72 verify_length bool = true
73 verify_checksum bool = true
74 flags DecompressFlags
75}
76
77// validate validates the gzip header of data and returns its parsed details if valid.
78// N.B.: only retained for API compatibility, all validation is now performed by the deflate backend.
79// The returned header details are not used by the decompressor.
80// TODO: remove after the deprecation period.
81@[deprecated: 'never used']
82@[deprecated_after: '2026-07-31']
83pub fn validate(data []u8, _ DecompressParams) !deflate.GzipHeader {
84 return deflate.validate_gzip_header(data)!
85}
86
87// decompress decompresses a gzip stream and returns the decompressed bytes in a new array.
88pub fn decompress(data []u8) ![]u8 {
89 return deflate.decompress_gzip(data)
90}
91
92// decompress_with_callback decompresses a gzip stream (RFC 1952) using a callback for chunked delivery.
93// The callback receives chunks of decompressed data and should return the chunk length to continue, or 0 to abort.
94// Returns the total decompressed length.
95pub fn decompress_with_callback(data []u8, cb deflate.ChunkCallback, userdata voidptr) !int {
96 deflate.validate_gzip_header(data)!
97 return deflate.decompress_with_callback(data, cb, userdata)
98}
99