aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-07-27 16:55:23 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-07-31 22:10:11 -0700
commit88ca75020909f922a5d3edfd1ca0be3ce148040f (patch)
tree47d6aefecb412c598c27399f211fa4ccabc5879b /lib/std
parentfa410cc234f4db16f9bdff3f9b0d0d66caa54c6b (diff)
downloadzig-88ca75020909f922a5d3edfd1ca0be3ce148040f.tar.gz
zig-88ca75020909f922a5d3edfd1ca0be3ce148040f.zip
std.compress.flate.Decompress: add rebase impl
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/compress/flate/Decompress.zig24
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/std/compress/flate/Decompress.zig b/lib/std/compress/flate/Decompress.zig
index 5f603baf9a..b55041ed78 100644
--- a/lib/std/compress/flate/Decompress.zig
+++ b/lib/std/compress/flate/Decompress.zig
@@ -1,11 +1,13 @@
const std = @import("../../std.zig");
+const assert = std.debug.assert;
const flate = std.compress.flate;
-const Container = flate.Container;
-const Token = @import("Token.zig");
const testing = std.testing;
-const Decompress = @This();
const Writer = std.Io.Writer;
const Reader = std.Io.Reader;
+const Container = flate.Container;
+
+const Decompress = @This();
+const Token = @import("Token.zig");
input: *Reader,
reader: Reader,
@@ -54,7 +56,10 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress {
.reader = .{
// TODO populate discard so that when an amount is discarded that
// includes an entire frame, skip decoding that frame.
- .vtable = &.{ .stream = stream },
+ .vtable = &.{
+ .stream = stream,
+ .rebase = rebase,
+ },
.buffer = buffer,
.seek = 0,
.end = 0,
@@ -69,6 +74,17 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress {
};
}
+fn rebase(r: *Reader, capacity: usize) Reader.RebaseError!void {
+ assert(capacity <= r.buffer.len - flate.history_len);
+ assert(r.end + capacity > r.buffer.len);
+ const buffered = r.buffer[0..r.end];
+ const discard = buffered.len - flate.history_len;
+ const keep = buffered[discard..];
+ @memmove(r.buffer[0..keep.len], keep);
+ r.end = keep.len;
+ r.seek -= discard;
+}
+
fn decodeLength(self: *Decompress, code: u8) !u16 {
if (code > 28) return error.InvalidCode;
const ml = Token.matchLength(code);