| ... | @@ -60,7 +60,7 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress { | ... | @@ -60,7 +60,7 @@ pub fn init(input: *Reader, container: Container, buffer: []u8) Decompress { |
| 60 | .stream = stream, | 60 | .stream = stream, |
| 61 | .rebase = rebase, | 61 | .rebase = rebase, |
| 62 | .discard = discard, | 62 | .discard = discard, |
| 63 | .readVec = Reader.indirectReadVec, | 63 | .readVec = readVec, |
| 64 | }, | 64 | }, |
| 65 | .buffer = buffer, | 65 | .buffer = buffer, |
| 66 | .seek = 0, | 66 | .seek = 0, |
| ... | @@ -109,6 +109,22 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize { | ... | @@ -109,6 +109,22 @@ fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize { |
| 109 | return n; | 109 | return n; |
| 110 | } | 110 | } |
| 111 | | 111 | |
| | 112 | fn readVec(r: *Reader, data: []const []u8) Reader.Error!usize { |
| | 113 | _ = data; |
| | 114 | assert(r.seek == r.end); |
| | 115 | r.rebase(flate.history_len) catch unreachable; |
| | 116 | var writer: Writer = .{ |
| | 117 | .buffer = r.buffer, |
| | 118 | .end = r.end, |
| | 119 | .vtable = &.{ .drain = Writer.fixedDrain }, |
| | 120 | }; |
| | 121 | r.end += r.vtable.stream(r, &writer, .limited(writer.buffer.len - writer.end)) catch |err| switch (err) { |
| | 122 | error.WriteFailed => unreachable, |
| | 123 | else => |e| return e, |
| | 124 | }; |
| | 125 | return 0; |
| | 126 | } |
| | 127 | |
| 112 | fn decodeLength(self: *Decompress, code: u8) !u16 { | 128 | fn decodeLength(self: *Decompress, code: u8) !u16 { |
| 113 | if (code > 28) return error.InvalidCode; | 129 | if (code > 28) return error.InvalidCode; |
| 114 | const ml = Token.matchLength(code); | 130 | const ml = Token.matchLength(code); |
| ... | @@ -1073,8 +1089,8 @@ test "reading into empty buffer" { | ... | @@ -1073,8 +1089,8 @@ test "reading into empty buffer" { |
| 1073 | var in: Reader = .fixed(input); | 1089 | var in: Reader = .fixed(input); |
| 1074 | var decomp: Decompress = .init(&in, .raw, &.{}); | 1090 | var decomp: Decompress = .init(&in, .raw, &.{}); |
| 1075 | const r = &decomp.reader; | 1091 | const r = &decomp.reader; |
| 1076 | var buf: [0]u8 = undefined; | 1092 | var bufs: [1][]u8 = .{&.{}}; |
| 1077 | try testing.expectEqual(0, try r.readVec(&.{&buf})); | 1093 | try testing.expectEqual(0, try r.readVec(&bufs)); |
| 1078 | } | 1094 | } |
| 1079 | | 1095 | |
| 1080 | test "zlib header" { | 1096 | test "zlib header" { |
| ... | @@ -1135,7 +1151,8 @@ test "zlib should not overshoot" { | ... | @@ -1135,7 +1151,8 @@ test "zlib should not overshoot" { |
| 1135 | | 1151 | |
| 1136 | var reader: std.Io.Reader = .fixed(&data); | 1152 | var reader: std.Io.Reader = .fixed(&data); |
| 1137 | | 1153 | |
| 1138 | var decompress: Decompress = .init(&reader, .zlib, &.{}); | 1154 | var decompress_buffer: [flate.max_window_len]u8 = undefined; |
| | 1155 | var decompress: Decompress = .init(&reader, .zlib, &decompress_buffer); |
| 1139 | var out: [128]u8 = undefined; | 1156 | var out: [128]u8 = undefined; |
| 1140 | | 1157 | |
| 1141 | { | 1158 | { |