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