authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-27 16:55:23-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 22:10:11-07:00
log88ca75020909f922a5d3edfd1ca0be3ce148040f
tree47d6aefecb412c598c27399f211fa4ccabc5879b
parentfa410cc234f4db16f9bdff3f9b0d0d66caa54c6b

std.compress.flate.Decompress: add rebase impl


1 files changed, 20 insertions(+), 4 deletions(-)

lib/std/compress/flate/Decompress.zig+20-4
...@@ -1,11 +1,13 @@...@@ -1,11 +1,13 @@
1const std = @import("../../std.zig");1const std = @import("../../std.zig");
2const assert = std.debug.assert;
2const flate = std.compress.flate;3const flate = std.compress.flate;
3const Container = flate.Container;
4const Token = @import("Token.zig");
5const testing = std.testing;4const testing = std.testing;
6const Decompress = @This();
7const Writer = std.Io.Writer;5const Writer = std.Io.Writer;
8const Reader = std.Io.Reader;6const Reader = std.Io.Reader;
7const Container = flate.Container;
8
9const Decompress = @This();
10const Token = @import("Token.zig");
911
10input: *Reader,12input: *Reader,
11reader: Reader,13reader: Reader,
...@@ -54,7 +56,10 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress {...@@ -54,7 +56,10 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress {
54 .reader = .{56 .reader = .{
55 // TODO populate discard so that when an amount is discarded that57 // TODO populate discard so that when an amount is discarded that
56 // includes an entire frame, skip decoding that frame.58 // includes an entire frame, skip decoding that frame.
57 .vtable = &.{ .stream = stream },59 .vtable = &.{
60 .stream = stream,
61 .rebase = rebase,
62 },
58 .buffer = buffer,63 .buffer = buffer,
59 .seek = 0,64 .seek = 0,
60 .end = 0,65 .end = 0,
...@@ -69,6 +74,17 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress {...@@ -69,6 +74,17 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress {
69 };74 };
70}75}
7176
77fn rebase(r: *Reader, capacity: usize) Reader.RebaseError!void {
78 assert(capacity <= r.buffer.len - flate.history_len);
79 assert(r.end + capacity > r.buffer.len);
80 const buffered = r.buffer[0..r.end];
81 const discard = buffered.len - flate.history_len;
82 const keep = buffered[discard..];
83 @memmove(r.buffer[0..keep.len], keep);
84 r.end = keep.len;
85 r.seek -= discard;
86}
87
72fn decodeLength(self: *Decompress, code: u8) !u16 {88fn decodeLength(self: *Decompress, code: u8) !u16 {
73 if (code > 28) return error.InvalidCode;89 if (code > 28) return error.InvalidCode;
74 const ml = Token.matchLength(code);90 const ml = Token.matchLength(code);