| ... | ... | @@ -34,6 +34,7 @@ pub fn Decoder(comptime ReaderType: type) type { |
| 34 | 34 | check: xz.Check, |
| 35 | 35 | err: ?Error, |
| 36 | 36 | to_read: ArrayListUnmanaged(u8), |
| 37 | read_pos: usize, |
| 37 | 38 | block_count: usize, |
| 38 | 39 | |
| 39 | 40 | fn init(allocator: Allocator, in_reader: ReaderType, check: xz.Check) !Self { |
| ... | ... | @@ -43,6 +44,7 @@ pub fn Decoder(comptime ReaderType: type) type { |
| 43 | 44 | .check = check, |
| 44 | 45 | .err = null, |
| 45 | 46 | .to_read = .{}, |
| 47 | .read_pos = 0, |
| 46 | 48 | .block_count = 0, |
| 47 | 49 | }; |
| 48 | 50 | } |
| ... | ... | @@ -57,25 +59,22 @@ pub fn Decoder(comptime ReaderType: type) type { |
| 57 | 59 | |
| 58 | 60 | pub fn read(self: *Self, output: []u8) Error!usize { |
| 59 | 61 | while (true) { |
| 60 | | if (self.to_read.items.len > 0) { |
| 61 | | const input = self.to_read.items; |
| 62 | | const n = @min(input.len, output.len); |
| 63 | | @memcpy(output[0..n], input[0..n]); |
| 64 | | std.mem.copyForwards(u8, input, input[n..]); |
| 65 | | self.to_read.shrinkRetainingCapacity(input.len - n); |
| 66 | | if (self.to_read.items.len == 0 and self.err != null) { |
| 67 | | if (self.err.? == DecodeError.EndOfStreamWithNoError) { |
| 68 | | return n; |
| 69 | | } |
| 70 | | return self.err.?; |
| 71 | | } |
| 62 | const unread_len = self.to_read.items.len - self.read_pos; |
| 63 | if (unread_len > 0) { |
| 64 | const n = @min(unread_len, output.len); |
| 65 | @memcpy(output[0..n], self.to_read.items[self.read_pos..][0..n]); |
| 66 | self.read_pos += n; |
| 72 | 67 | return n; |
| 73 | 68 | } |
| 74 | | if (self.err != null) { |
| 75 | | if (self.err.? == DecodeError.EndOfStreamWithNoError) { |
| 69 | if (self.err) |e| { |
| 70 | if (e == DecodeError.EndOfStreamWithNoError) { |
| 76 | 71 | return 0; |
| 77 | 72 | } |
| 78 | | return self.err.?; |
| 73 | return e; |
| 74 | } |
| 75 | if (self.read_pos > 0) { |
| 76 | self.to_read.shrinkRetainingCapacity(0); |
| 77 | self.read_pos = 0; |
| 79 | 78 | } |
| 80 | 79 | self.readBlock() catch |e| { |
| 81 | 80 | self.err = e; |
| ... | ... | @@ -84,8 +83,6 @@ pub fn Decoder(comptime ReaderType: type) type { |
| 84 | 83 | } |
| 85 | 84 | |
| 86 | 85 | fn readBlock(self: *Self) Error!void { |
| 87 | | const unpacked_pos = self.to_read.items.len; |
| 88 | | |
| 89 | 86 | var block_counter = std.io.countingReader(self.inner_reader); |
| 90 | 87 | const block_reader = block_counter.reader(); |
| 91 | 88 | |
| ... | ... | @@ -166,7 +163,7 @@ pub fn Decoder(comptime ReaderType: type) type { |
| 166 | 163 | return error.CorruptInput; |
| 167 | 164 | } |
| 168 | 165 | |
| 169 | | const unpacked_bytes = self.to_read.items[unpacked_pos..]; |
| 166 | const unpacked_bytes = self.to_read.items; |
| 170 | 167 | if (unpacked_size) |s| { |
| 171 | 168 | if (s != unpacked_bytes.len) |
| 172 | 169 | return error.CorruptInput; |