| author | |
| committer | |
| log | 8523cbef0e0145a1f4de84f49044b8c9a8657108 |
| tree | 7758461ad457121a94bc7e240855edf3afdd4630 |
| parent | 58e60697e2930f4311ae9e744ae1c2877e0b69ed |
2 files changed, 22 insertions(+), 4 deletions(-)
lib/std/compress/lzma.zig+12-1| ... | ... | @@ -696,6 +696,7 @@ pub const Decompress = struct { |
| 696 | 696 | .vtable = &.{ |
| 697 | 697 | .readVec = readVec, |
| 698 | 698 | .stream = stream, |
| 699 | .discard = discard, | |
| 699 | 700 | }, |
| 700 | 701 | .seek = 0, |
| 701 | 702 | .end = 0, |
| ... | ... | @@ -746,12 +747,22 @@ pub const Decompress = struct { |
| 746 | 747 | return readIndirect(r); |
| 747 | 748 | } |
| 748 | 749 | |
| 750 | fn discard(r: *Reader, limit: std.Io.Limit) Reader.Error!usize { | |
| 751 | const d: *Decompress = @alignCast(@fieldParentPtr("reader", r)); | |
| 752 | _ = d; | |
| 753 | _ = limit; | |
| 754 | @panic("TODO"); | |
| 755 | } | |
| 756 | ||
| 749 | 757 | fn readIndirect(r: *Reader) Reader.Error!usize { |
| 750 | 758 | const d: *Decompress = @alignCast(@fieldParentPtr("reader", r)); |
| 751 | 759 | const gpa = d.gpa; |
| 752 | 760 | var allocating = Writer.Allocating.initOwnedSlice(gpa, r.buffer); |
| 753 | 761 | allocating.writer.end = r.end; |
| 754 | defer r.end = allocating.writer.end; | |
| 762 | defer { | |
| 763 | r.buffer = allocating.writer.buffer; | |
| 764 | r.end = allocating.writer.end; | |
| 765 | } | |
| 755 | 766 | if (d.decode.state == math.maxInt(usize)) return error.EndOfStream; |
| 756 | 767 | d.decode.process(d.input, &allocating, &d.buffer, &d.range_decoder) catch |err| switch (err) { |
| 757 | 768 | error.WriteFailed => { |
lib/std/compress/lzma/test.zig+10-3| ... | ... | @@ -18,7 +18,14 @@ fn testDecompressEqual(expected: []const u8, compressed: []const u8) !void { |
| 18 | 18 | } |
| 19 | 19 | |
| 20 | 20 | fn testDecompressError(expected: anyerror, compressed: []const u8) !void { |
| 21 | return std.testing.expectError(expected, testDecompress(compressed)); | |
| 21 | const gpa = std.testing.allocator; | |
| 22 | var stream: std.Io.Reader = .fixed(compressed); | |
| 23 | ||
| 24 | var decompressor = try lzma.Decompress.initOptions(&stream, gpa, &.{}, .{}, std.math.maxInt(u32)); | |
| 25 | defer decompressor.deinit(); | |
| 26 | ||
| 27 | try std.testing.expectError(error.ReadFailed, decompressor.reader.allocRemaining(gpa, .unlimited)); | |
| 28 | try std.testing.expectEqual(expected, decompressor.err orelse return error.TestFailed); | |
| 22 | 29 | } |
| 23 | 30 | |
| 24 | 31 | test "decompress empty world" { |
| ... | ... | @@ -76,14 +83,14 @@ test "known size with end of payload marker" { |
| 76 | 83 | |
| 77 | 84 | test "too big uncompressed size in header" { |
| 78 | 85 | try testDecompressError( |
| 79 | error.CorruptInput, | |
| 86 | error.DecompressedSizeMismatch, | |
| 80 | 87 | @embedFile("testdata/bad-too_big_size-with_eopm.lzma"), |
| 81 | 88 | ); |
| 82 | 89 | } |
| 83 | 90 | |
| 84 | 91 | test "too small uncompressed size in header" { |
| 85 | 92 | try testDecompressError( |
| 86 | error.CorruptInput, | |
| 93 | error.DecompressedSizeMismatch, | |
| 87 | 94 | @embedFile("testdata/bad-too_small_size-without_eopm-3.lzma"), |
| 88 | 95 | ); |
| 89 | 96 | } |