| ... | ... | @@ -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,13 +59,12 @@ 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 input = self.to_read.items[self.read_pos..]; |
| 63 | if (input.len > 0) { |
| 62 | 64 | const n = @min(input.len, output.len); |
| 63 | 65 | @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) { |
| 66 | self.read_pos += n; |
| 67 | if (self.read_pos == self.to_read.items.len and self.err != null) { |
| 67 | 68 | if (self.err.? == DecodeError.EndOfStreamWithNoError) { |
| 68 | 69 | return n; |
| 69 | 70 | } |
| ... | ... | @@ -77,6 +78,10 @@ pub fn Decoder(comptime ReaderType: type) type { |
| 77 | 78 | } |
| 78 | 79 | return self.err.?; |
| 79 | 80 | } |
| 81 | if (self.read_pos > 0) { |
| 82 | self.to_read.shrinkRetainingCapacity(0); |
| 83 | self.read_pos = 0; |
| 84 | } |
| 80 | 85 | self.readBlock() catch |e| { |
| 81 | 86 | self.err = e; |
| 82 | 87 | }; |