mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
std.compress.zstd.Decompress: implement discard and readVec
This commit is contained in:
parent
84e4343b0c
commit
4c04835a08
2 changed files with 32 additions and 22 deletions
|
|
@ -438,23 +438,6 @@ pub fn defaultReadVec(r: *Reader, data: []const []u8) Error!usize {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Always writes to `Reader.buffer` and returns 0.
|
|
||||||
pub fn indirectReadVec(r: *Reader, data: []const []u8) Error!usize {
|
|
||||||
_ = data;
|
|
||||||
assert(r.seek == r.end);
|
|
||||||
var writer: Writer = .{
|
|
||||||
.buffer = r.buffer,
|
|
||||||
.end = r.end,
|
|
||||||
.vtable = &.{ .drain = Writer.fixedDrain },
|
|
||||||
};
|
|
||||||
const limit: Limit = .limited(writer.buffer.len - writer.end);
|
|
||||||
r.end += r.vtable.stream(r, &writer, limit) catch |err| switch (err) {
|
|
||||||
error.WriteFailed => unreachable,
|
|
||||||
else => |e| return e,
|
|
||||||
};
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn buffered(r: *Reader) []u8 {
|
pub fn buffered(r: *Reader) []u8 {
|
||||||
return r.buffer[r.seek..r.end];
|
return r.buffer[r.seek..r.end];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ pub fn init(input: *Reader, buffer: []u8, options: Options) Decompress {
|
||||||
.stream = stream,
|
.stream = stream,
|
||||||
.rebase = rebase,
|
.rebase = rebase,
|
||||||
.discard = discard,
|
.discard = discard,
|
||||||
.readVec = Reader.indirectReadVec,
|
.readVec = readVec,
|
||||||
},
|
},
|
||||||
.buffer = buffer,
|
.buffer = buffer,
|
||||||
.seek = 0,
|
.seek = 0,
|
||||||
|
|
@ -109,10 +109,20 @@ fn rebase(r: *Reader, capacity: usize) Reader.RebaseError!void {
|
||||||
r.seek -= discard_n;
|
r.seek -= discard_n;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
|
/// This could be improved so that when an amount is discarded that includes an
|
||||||
r.rebase(zstd.block_size_max) catch unreachable;
|
/// entire frame, skip decoding that frame.
|
||||||
var d: Writer.Discarding = .init(r.buffer);
|
fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize {
|
||||||
const n = r.stream(&d.writer, limit) catch |err| switch (err) {
|
const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
|
||||||
|
r.rebase(d.window_len) catch unreachable;
|
||||||
|
var writer: Writer = .{
|
||||||
|
.vtable = &.{
|
||||||
|
.drain = std.Io.Writer.Discarding.drain,
|
||||||
|
.sendFile = std.Io.Writer.Discarding.sendFile,
|
||||||
|
},
|
||||||
|
.buffer = r.buffer,
|
||||||
|
.end = r.end,
|
||||||
|
};
|
||||||
|
const n = r.stream(&writer, limit) catch |err| switch (err) {
|
||||||
error.WriteFailed => unreachable,
|
error.WriteFailed => unreachable,
|
||||||
error.ReadFailed => return error.ReadFailed,
|
error.ReadFailed => return error.ReadFailed,
|
||||||
error.EndOfStream => return error.EndOfStream,
|
error.EndOfStream => return error.EndOfStream,
|
||||||
|
|
@ -121,6 +131,23 @@ fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn readVec(r: *Reader, data: []const []u8) Reader.Error!usize {
|
||||||
|
_ = data;
|
||||||
|
const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
|
||||||
|
assert(r.seek == r.end);
|
||||||
|
r.rebase(d.window_len) catch unreachable;
|
||||||
|
var writer: Writer = .{
|
||||||
|
.buffer = r.buffer,
|
||||||
|
.end = r.end,
|
||||||
|
.vtable = &.{ .drain = Writer.fixedDrain },
|
||||||
|
};
|
||||||
|
r.end += r.vtable.stream(r, &writer, .limited(writer.buffer.len - writer.end)) catch |err| switch (err) {
|
||||||
|
error.WriteFailed => unreachable,
|
||||||
|
else => |e| return e,
|
||||||
|
};
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
|
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
|
||||||
const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
|
const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
|
||||||
const in = d.input;
|
const in = d.input;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue