| author | |
| committer | |
| log | c9915e949ebd4aa0d4d24ef5808ba0b1cff2ecfe |
| tree | 88e25116a93a810f1972dbb2b2232fbf41cf1b43 |
| parent | bc9db143c9e2beb166c637dd7fc56c4912f93794 |
14 files changed, 90 insertions(+), 106 deletions(-)
lib/std/Build.zig+2-2| ... | @@ -2802,8 +2802,8 @@ pub fn dumpBadGetPathHelp( | ... | @@ -2802,8 +2802,8 @@ pub fn dumpBadGetPathHelp( |
| 2802 | src_builder: *Build, | 2802 | src_builder: *Build, |
| 2803 | asking_step: ?*Step, | 2803 | asking_step: ?*Step, |
| 2804 | ) anyerror!void { | 2804 | ) anyerror!void { |
| 2805 | var fw = stderr.writer(); | 2805 | var fw = stderr.writer(&.{}); |
| 2806 | var bw = fw.interface().unbuffered(); | 2806 | const bw = &fw.interface; |
| 2807 | try bw.print( | 2807 | try bw.print( |
| 2808 | \\getPath() was called on a GeneratedFile that wasn't built yet. | 2808 | \\getPath() was called on a GeneratedFile that wasn't built yet. |
| 2809 | \\ source package path: {s} | 2809 | \\ source package path: {s} |
lib/std/Build/Cache.zig+2-2| ... | @@ -661,9 +661,9 @@ pub const Manifest = struct { | ... | @@ -661,9 +661,9 @@ pub const Manifest = struct { |
| 661 | } { | 661 | } { |
| 662 | const gpa = self.cache.gpa; | 662 | const gpa = self.cache.gpa; |
| 663 | const input_file_count = self.files.entries.len; | 663 | const input_file_count = self.files.entries.len; |
| 664 | var manifest_reader = self.manifest_file.?.reader(); // Reads positionally from zero. | 664 | var manifest_reader = self.manifest_file.?.reader(&.{}); // Reads positionally from zero. |
| 665 | const limit: std.io.Limit = .limited(manifest_file_size_max); | 665 | const limit: std.io.Limit = .limited(manifest_file_size_max); |
| 666 | const file_contents = manifest_reader.interface().allocRemaining(gpa, limit) catch |err| switch (err) { | 666 | const file_contents = manifest_reader.interface.allocRemaining(gpa, limit) catch |err| switch (err) { |
| 667 | error.OutOfMemory => return error.OutOfMemory, | 667 | error.OutOfMemory => return error.OutOfMemory, |
| 668 | error.StreamTooLong => return error.OutOfMemory, | 668 | error.StreamTooLong => return error.OutOfMemory, |
| 669 | error.ReadFailed => { | 669 | error.ReadFailed => { |
lib/std/Build/Step.zig+2-2| ... | @@ -287,8 +287,8 @@ pub fn cast(step: *Step, comptime T: type) ?*T { | ... | @@ -287,8 +287,8 @@ pub fn cast(step: *Step, comptime T: type) ?*T { |
| 287 | 287 | ||
| 288 | /// For debugging purposes, prints identifying information about this Step. | 288 | /// For debugging purposes, prints identifying information about this Step. |
| 289 | pub fn dump(step: *Step, file: std.fs.File) void { | 289 | pub fn dump(step: *Step, file: std.fs.File) void { |
| 290 | var fw = file.writer(); | 290 | var fw = file.writer(&.{}); |
| 291 | var bw = fw.interface().unbuffered(); | 291 | const bw = &fw.interface; |
| 292 | const tty_config = std.io.tty.detectConfig(file); | 292 | const tty_config = std.io.tty.detectConfig(file); |
| 293 | const debug_info = std.debug.getSelfDebugInfo() catch |err| { | 293 | const debug_info = std.debug.getSelfDebugInfo() catch |err| { |
| 294 | bw.print("Unable to dump stack trace: Unable to open debug info: {s}\n", .{ | 294 | bw.print("Unable to dump stack trace: Unable to open debug info: {s}\n", .{ |
lib/std/Build/Step/ConfigHeader.zig+3-3| ... | @@ -753,17 +753,17 @@ fn testReplaceVariablesAutoconfAt( | ... | @@ -753,17 +753,17 @@ fn testReplaceVariablesAutoconfAt( |
| 753 | expected: []const u8, | 753 | expected: []const u8, |
| 754 | values: std.StringArrayHashMap(Value), | 754 | values: std.StringArrayHashMap(Value), |
| 755 | ) !void { | 755 | ) !void { |
| 756 | var output: std.ArrayList(u8) = .init(allocator); | 756 | var output: std.io.Writer.Allocating = .init(allocator); |
| 757 | defer output.deinit(); | 757 | defer output.deinit(); |
| 758 | 758 | ||
| 759 | const used = try allocator.alloc(bool, values.count()); | 759 | const used = try allocator.alloc(bool, values.count()); |
| 760 | for (used) |*u| u.* = false; | 760 | for (used) |*u| u.* = false; |
| 761 | defer allocator.free(used); | 761 | defer allocator.free(used); |
| 762 | 762 | ||
| 763 | try expand_variables_autoconf_at(&output, contents, values, used); | 763 | try expand_variables_autoconf_at(&output.interface, contents, values, used); |
| 764 | 764 | ||
| 765 | for (used) |u| if (!u) return error.UnusedValue; | 765 | for (used) |u| if (!u) return error.UnusedValue; |
| 766 | try std.testing.expectEqualStrings(expected, output.items); | 766 | try std.testing.expectEqualStrings(expected, output.getWritten()); |
| 767 | } | 767 | } |
| 768 | 768 | ||
| 769 | fn testReplaceVariablesCMake( | 769 | fn testReplaceVariablesCMake( |
lib/std/Build/Step/Options.zig+1-1| ... | @@ -667,5 +667,5 @@ test Options { | ... | @@ -667,5 +667,5 @@ test Options { |
| 667 | \\ | 667 | \\ |
| 668 | , options.contents.items); | 668 | , options.contents.items); |
| 669 | 669 | ||
| 670 | _ = try std.zig.Ast.parse(arena.allocator(), try options.contents.toOwnedSliceSentinel(0), .zig); | 670 | _ = try std.zig.Ast.parse(arena.allocator(), try options.contents.toOwnedSliceSentinel(arena.allocator(), 0), .zig); |
| 671 | } | 671 | } |
lib/std/Thread.zig+9-8| ... | @@ -163,11 +163,12 @@ pub fn setName(self: Thread, name: []const u8) SetNameError!void { | ... | @@ -163,11 +163,12 @@ pub fn setName(self: Thread, name: []const u8) SetNameError!void { |
| 163 | } else { | 163 | } else { |
| 164 | var buf: [32]u8 = undefined; | 164 | var buf: [32]u8 = undefined; |
| 165 | const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); | 165 | const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); |
| 166 | |||
| 167 | const file = try std.fs.cwd().openFile(path, .{ .mode = .write_only }); | 166 | const file = try std.fs.cwd().openFile(path, .{ .mode = .write_only }); |
| 168 | defer file.close(); | 167 | defer file.close(); |
| 169 | 168 | var fw = file.writer(&.{}); | |
| 170 | try file.writer().writeAll(name); | 169 | fw.interface.writeAll(name) catch |err| switch (err) { |
| 170 | error.WriteFailed => return fw.err.?, | ||
| 171 | }; | ||
| 171 | return; | 172 | return; |
| 172 | }, | 173 | }, |
| 173 | .windows => { | 174 | .windows => { |
| ... | @@ -277,13 +278,13 @@ pub fn getName(self: Thread, buffer_ptr: *[max_name_len:0]u8) GetNameError!?[]co | ... | @@ -277,13 +278,13 @@ pub fn getName(self: Thread, buffer_ptr: *[max_name_len:0]u8) GetNameError!?[]co |
| 277 | } else { | 278 | } else { |
| 278 | var buf: [32]u8 = undefined; | 279 | var buf: [32]u8 = undefined; |
| 279 | const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); | 280 | const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); |
| 280 | |||
| 281 | const file = try std.fs.cwd().openFile(path, .{}); | 281 | const file = try std.fs.cwd().openFile(path, .{}); |
| 282 | defer file.close(); | 282 | defer file.close(); |
| 283 | 283 | var fr = file.reader(&.{}); | |
| 284 | const data_len = try file.reader().readAll(buffer_ptr[0 .. max_name_len + 1]); | 284 | const n = fr.interface.readSliceShort(buffer_ptr[0 .. max_name_len + 1]) catch |err| switch (err) { |
| 285 | 285 | error.ReadFailed => return fr.err.?, | |
| 286 | return if (data_len >= 1) buffer[0 .. data_len - 1] else null; | 286 | }; |
| 287 | return if (n == 0) null else buffer[0 .. n - 1]; | ||
| 287 | }, | 288 | }, |
| 288 | .windows => { | 289 | .windows => { |
| 289 | const buf_capacity = @sizeOf(windows.UNICODE_STRING) + (@sizeOf(u16) * max_name_len); | 290 | const buf_capacity = @sizeOf(windows.UNICODE_STRING) + (@sizeOf(u16) * max_name_len); |
lib/std/compress/flate.zig+27-27| ... | @@ -232,16 +232,15 @@ test "compress/decompress" { | ... | @@ -232,16 +232,15 @@ test "compress/decompress" { |
| 232 | { | 232 | { |
| 233 | var original: std.io.Reader = .fixed(data); | 233 | var original: std.io.Reader = .fixed(data); |
| 234 | var compressed: Writer = .fixed(&cmp_buf); | 234 | var compressed: Writer = .fixed(&cmp_buf); |
| 235 | var compress: Compress = .init(&original, .raw); | 235 | var compress: Compress = .init(&original, &.{}, .{ .container = .raw, .level = level }); |
| 236 | var compress_br = compress.readable(&.{}); | 236 | const n = try compress.reader.streamRemaining(&compressed); |
| 237 | const n = try compress_br.readRemaining(&compressed, .{ .level = level }); | ||
| 238 | if (compressed_size == 0) { | 237 | if (compressed_size == 0) { |
| 239 | if (container == .gzip) | 238 | if (container == .gzip) |
| 240 | print("case {d} gzip level {} compressed size: {d}\n", .{ case_no, level, compressed.pos }); | 239 | print("case {d} gzip level {} compressed size: {d}\n", .{ case_no, level, compressed.pos }); |
| 241 | compressed_size = compressed.pos; | 240 | compressed_size = compressed.end; |
| 242 | } | 241 | } |
| 243 | try testing.expectEqual(compressed_size, n); | 242 | try testing.expectEqual(compressed_size, n); |
| 244 | try testing.expectEqual(compressed_size, compressed.pos); | 243 | try testing.expectEqual(compressed_size, compressed.end); |
| 245 | } | 244 | } |
| 246 | // decompress compressed stream to decompressed stream | 245 | // decompress compressed stream to decompressed stream |
| 247 | { | 246 | { |
| ... | @@ -450,12 +449,15 @@ test "gzip header" { | ... | @@ -450,12 +449,15 @@ test "gzip header" { |
| 450 | } | 449 | } |
| 451 | 450 | ||
| 452 | test "public interface" { | 451 | test "public interface" { |
| 453 | const plain_data = [_]u8{ 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', 0x0a }; | 452 | const plain_data_buf = [_]u8{ 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', 0x0a }; |
| 454 | 453 | ||
| 455 | // deflate final stored block, header + plain (stored) data | 454 | // deflate final stored block, header + plain (stored) data |
| 456 | const deflate_block = [_]u8{ | 455 | const deflate_block = [_]u8{ |
| 457 | 0b0000_0001, 0b0000_1100, 0x00, 0b1111_0011, 0xff, // deflate fixed buffer header len, nlen | 456 | 0b0000_0001, 0b0000_1100, 0x00, 0b1111_0011, 0xff, // deflate fixed buffer header len, nlen |
| 458 | } ++ plain_data; | 457 | } ++ plain_data_buf; |
| 458 | |||
| 459 | const plain_data: []const u8 = &plain_data_buf; | ||
| 460 | const gzip_data: []const u8 = &deflate_block; | ||
| 459 | 461 | ||
| 460 | //// gzip header/footer + deflate block | 462 | //// gzip header/footer + deflate block |
| 461 | //const gzip_data = | 463 | //const gzip_data = |
| ... | @@ -471,23 +473,21 @@ test "public interface" { | ... | @@ -471,23 +473,21 @@ test "public interface" { |
| 471 | // TODO | 473 | // TODO |
| 472 | //const gzip = @import("gzip.zig"); | 474 | //const gzip = @import("gzip.zig"); |
| 473 | //const zlib = @import("zlib.zig"); | 475 | //const zlib = @import("zlib.zig"); |
| 474 | const flate = @This(); | ||
| 475 | 476 | ||
| 476 | //try testInterface(gzip, &gzip_data, &plain_data); | ||
| 477 | //try testInterface(zlib, &zlib_data, &plain_data); | ||
| 478 | try testInterface(flate, &deflate_block, &plain_data); | ||
| 479 | } | ||
| 480 | |||
| 481 | fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const u8) !void { | ||
| 482 | var buffer1: [64]u8 = undefined; | 477 | var buffer1: [64]u8 = undefined; |
| 483 | var buffer2: [64]u8 = undefined; | 478 | var buffer2: [64]u8 = undefined; |
| 484 | 479 | ||
| 480 | // TODO These used to be functions, need to migrate the tests | ||
| 481 | const decompress = void; | ||
| 482 | const compress = void; | ||
| 483 | const store = void; | ||
| 484 | |||
| 485 | // decompress | 485 | // decompress |
| 486 | { | 486 | { |
| 487 | var plain: Writer = .fixed(&buffer2); | 487 | var plain: Writer = .fixed(&buffer2); |
| 488 | 488 | ||
| 489 | var in: std.io.Reader = .fixed(gzip_data); | 489 | var in: std.io.Reader = .fixed(gzip_data); |
| 490 | try pkg.decompress(&in, &plain); | 490 | try decompress(&in, &plain); |
| 491 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 491 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 492 | } | 492 | } |
| 493 | 493 | ||
| ... | @@ -497,10 +497,10 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const | ... | @@ -497,10 +497,10 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const |
| 497 | var compressed: Writer = .fixed(&buffer1); | 497 | var compressed: Writer = .fixed(&buffer1); |
| 498 | 498 | ||
| 499 | var in: std.io.Reader = .fixed(plain_data); | 499 | var in: std.io.Reader = .fixed(plain_data); |
| 500 | try pkg.compress(&in, &compressed, .{}); | 500 | try compress(&in, &compressed, .{}); |
| 501 | 501 | ||
| 502 | var compressed_br: std.io.Reader = .fixed(&buffer1); | 502 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 503 | try pkg.decompress(&compressed_br, &plain); | 503 | try decompress(&compressed_br, &plain); |
| 504 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 504 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 505 | } | 505 | } |
| 506 | 506 | ||
| ... | @@ -510,12 +510,12 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const | ... | @@ -510,12 +510,12 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const |
| 510 | var compressed: Writer = .fixed(&buffer1); | 510 | var compressed: Writer = .fixed(&buffer1); |
| 511 | 511 | ||
| 512 | var in: std.io.Reader = .fixed(plain_data); | 512 | var in: std.io.Reader = .fixed(plain_data); |
| 513 | var cmp = try pkg.compressor(&compressed, .{}); | 513 | var cmp = try Compress(&compressed, .{}); |
| 514 | try cmp.compress(&in); | 514 | try cmp.compress(&in); |
| 515 | try cmp.finish(); | 515 | try cmp.finish(); |
| 516 | 516 | ||
| 517 | var compressed_br: std.io.Reader = .fixed(&buffer1); | 517 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 518 | var dcp = pkg.decompressor(&compressed_br); | 518 | var dcp = Decompress(&compressed_br); |
| 519 | try dcp.decompress(&plain); | 519 | try dcp.decompress(&plain); |
| 520 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 520 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 521 | } | 521 | } |
| ... | @@ -528,10 +528,10 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const | ... | @@ -528,10 +528,10 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const |
| 528 | var compressed: Writer = .fixed(&buffer1); | 528 | var compressed: Writer = .fixed(&buffer1); |
| 529 | 529 | ||
| 530 | var in: std.io.Reader = .fixed(plain_data); | 530 | var in: std.io.Reader = .fixed(plain_data); |
| 531 | try pkg.huffman.compress(&in, &compressed); | 531 | try huffman.compress(&in, &compressed); |
| 532 | 532 | ||
| 533 | var compressed_br: std.io.Reader = .fixed(&buffer1); | 533 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 534 | try pkg.decompress(&compressed_br, &plain); | 534 | try decompress(&compressed_br, &plain); |
| 535 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 535 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 536 | } | 536 | } |
| 537 | 537 | ||
| ... | @@ -541,12 +541,12 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const | ... | @@ -541,12 +541,12 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const |
| 541 | var compressed: Writer = .fixed(&buffer1); | 541 | var compressed: Writer = .fixed(&buffer1); |
| 542 | 542 | ||
| 543 | var in: std.io.Reader = .fixed(plain_data); | 543 | var in: std.io.Reader = .fixed(plain_data); |
| 544 | var cmp = try pkg.huffman.compressor(&compressed); | 544 | var cmp = try huffman.Compressor(&compressed); |
| 545 | try cmp.compress(&in); | 545 | try cmp.compress(&in); |
| 546 | try cmp.finish(); | 546 | try cmp.finish(); |
| 547 | 547 | ||
| 548 | var compressed_br: std.io.Reader = .fixed(&buffer1); | 548 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 549 | try pkg.decompress(&compressed_br, &plain); | 549 | try decompress(&compressed_br, &plain); |
| 550 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 550 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 551 | } | 551 | } |
| 552 | } | 552 | } |
| ... | @@ -559,10 +559,10 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const | ... | @@ -559,10 +559,10 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const |
| 559 | var compressed: Writer = .fixed(&buffer1); | 559 | var compressed: Writer = .fixed(&buffer1); |
| 560 | 560 | ||
| 561 | var in: std.io.Reader = .fixed(plain_data); | 561 | var in: std.io.Reader = .fixed(plain_data); |
| 562 | try pkg.store.compress(&in, &compressed); | 562 | try store.compress(&in, &compressed); |
| 563 | 563 | ||
| 564 | var compressed_br: std.io.Reader = .fixed(&buffer1); | 564 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 565 | try pkg.decompress(&compressed_br, &plain); | 565 | try decompress(&compressed_br, &plain); |
| 566 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 566 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 567 | } | 567 | } |
| 568 | 568 | ||
| ... | @@ -572,12 +572,12 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const | ... | @@ -572,12 +572,12 @@ fn testInterface(comptime pkg: type, gzip_data: []const u8, plain_data: []const |
| 572 | var compressed: Writer = .fixed(&buffer1); | 572 | var compressed: Writer = .fixed(&buffer1); |
| 573 | 573 | ||
| 574 | var in: std.io.Reader = .fixed(plain_data); | 574 | var in: std.io.Reader = .fixed(plain_data); |
| 575 | var cmp = try pkg.store.compressor(&compressed); | 575 | var cmp = try store.compressor(&compressed); |
| 576 | try cmp.compress(&in); | 576 | try cmp.compress(&in); |
| 577 | try cmp.finish(); | 577 | try cmp.finish(); |
| 578 | 578 | ||
| 579 | var compressed_br: std.io.Reader = .fixed(&buffer1); | 579 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 580 | try pkg.decompress(&compressed_br, &plain); | 580 | try decompress(&compressed_br, &plain); |
| 581 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); | 581 | try testing.expectEqualSlices(u8, plain_data, plain.getWritten()); |
| 582 | } | 582 | } |
| 583 | } | 583 | } |
lib/std/compress/flate/Compress.zig+17-23| ... | @@ -48,6 +48,7 @@ const expect = testing.expect; | ... | @@ -48,6 +48,7 @@ const expect = testing.expect; |
| 48 | const mem = std.mem; | 48 | const mem = std.mem; |
| 49 | const math = std.math; | 49 | const math = std.math; |
| 50 | const Writer = std.io.Writer; | 50 | const Writer = std.io.Writer; |
| 51 | const Reader = std.io.Reader; | ||
| 51 | 52 | ||
| 52 | const Compress = @This(); | 53 | const Compress = @This(); |
| 53 | const Token = @import("Token.zig"); | 54 | const Token = @import("Token.zig"); |
| ... | @@ -64,20 +65,13 @@ input: *std.io.Reader, | ... | @@ -64,20 +65,13 @@ input: *std.io.Reader, |
| 64 | block_writer: BlockWriter, | 65 | block_writer: BlockWriter, |
| 65 | level: LevelArgs, | 66 | level: LevelArgs, |
| 66 | hasher: Container.Hasher, | 67 | hasher: Container.Hasher, |
| 68 | reader: std.io.Reader, | ||
| 67 | 69 | ||
| 68 | // Match and literal at the previous position. | 70 | // Match and literal at the previous position. |
| 69 | // Used for lazy match finding in processWindow. | 71 | // Used for lazy match finding in processWindow. |
| 70 | prev_match: ?Token = null, | 72 | prev_match: ?Token = null, |
| 71 | prev_literal: ?u8 = null, | 73 | prev_literal: ?u8 = null, |
| 72 | 74 | ||
| 73 | pub fn reader(c: *Compress, buffer: []u8) std.io.Reader { | ||
| 74 | return .{ | ||
| 75 | .context = c, | ||
| 76 | .vtable = .{ .read = read }, | ||
| 77 | .buffer = buffer, | ||
| 78 | }; | ||
| 79 | } | ||
| 80 | |||
| 81 | pub const Options = struct { | 75 | pub const Options = struct { |
| 82 | level: Level = .default, | 76 | level: Level = .default, |
| 83 | container: Container = .raw, | 77 | container: Container = .raw, |
| ... | @@ -125,13 +119,17 @@ const LevelArgs = struct { | ... | @@ -125,13 +119,17 @@ const LevelArgs = struct { |
| 125 | } | 119 | } |
| 126 | }; | 120 | }; |
| 127 | 121 | ||
| 128 | pub fn init(input: *std.io.Reader, options: Options) Compress { | 122 | pub fn init(input: *std.io.Reader, buffer: []u8, options: Options) Compress { |
| 129 | return .{ | 123 | return .{ |
| 130 | .input = input, | 124 | .input = input, |
| 131 | .block_writer = undefined, | 125 | .block_writer = undefined, |
| 132 | .level = .get(options.level), | 126 | .level = .get(options.level), |
| 133 | .hasher = .init(options.container), | 127 | .hasher = .init(options.container), |
| 134 | .state = .header, | 128 | .state = .header, |
| 129 | .reader = .{ | ||
| 130 | .buffer = buffer, | ||
| 131 | .stream = stream, | ||
| 132 | }, | ||
| 135 | }; | 133 | }; |
| 136 | } | 134 | } |
| 137 | 135 | ||
| ... | @@ -758,16 +756,12 @@ fn byFreq(context: void, a: LiteralNode, b: LiteralNode) bool { | ... | @@ -758,16 +756,12 @@ fn byFreq(context: void, a: LiteralNode, b: LiteralNode) bool { |
| 758 | return a.freq < b.freq; | 756 | return a.freq < b.freq; |
| 759 | } | 757 | } |
| 760 | 758 | ||
| 761 | fn read( | 759 | fn stream(r: *Reader, w: *Writer, limit: std.io.Limit) Reader.StreamError!usize { |
| 762 | context: ?*anyopaque, | 760 | const c: *Compress = @fieldParentPtr("reader", r); |
| 763 | bw: *Writer, | ||
| 764 | limit: std.io.Limit, | ||
| 765 | ) std.io.Reader.StreamError!usize { | ||
| 766 | const c: *Compress = @ptrCast(@alignCast(context)); | ||
| 767 | switch (c.state) { | 761 | switch (c.state) { |
| 768 | .header => |i| { | 762 | .header => |i| { |
| 769 | const header = c.hasher.container().header(); | 763 | const header = c.hasher.container().header(); |
| 770 | const n = try bw.write(header[i..]); | 764 | const n = try w.write(header[i..]); |
| 771 | if (header.len - i - n == 0) { | 765 | if (header.len - i - n == 0) { |
| 772 | c.state = .middle; | 766 | c.state = .middle; |
| 773 | } else { | 767 | } else { |
| ... | @@ -788,18 +782,18 @@ fn read( | ... | @@ -788,18 +782,18 @@ fn read( |
| 788 | const history_plus_lookahead_len = flate.history_len + min_lookahead; | 782 | const history_plus_lookahead_len = flate.history_len + min_lookahead; |
| 789 | if (buffer_contents.len < history_plus_lookahead_len) return 0; | 783 | if (buffer_contents.len < history_plus_lookahead_len) return 0; |
| 790 | const lookahead = buffer_contents[flate.history_len..]; | 784 | const lookahead = buffer_contents[flate.history_len..]; |
| 791 | const start = bw.count; | 785 | const start = w.count; |
| 792 | const n = try c.tokenizeSlice(bw, limit, lookahead) catch |err| switch (err) { | 786 | const n = try c.tokenizeSlice(w, limit, lookahead) catch |err| switch (err) { |
| 793 | error.WriteFailed => return error.WriteFailed, | 787 | error.WriteFailed => return error.WriteFailed, |
| 794 | }; | 788 | }; |
| 795 | c.hasher.update(lookahead[0..n]); | 789 | c.hasher.update(lookahead[0..n]); |
| 796 | c.input.toss(n); | 790 | c.input.toss(n); |
| 797 | return bw.count - start; | 791 | return w.count - start; |
| 798 | }, | 792 | }, |
| 799 | .final => { | 793 | .final => { |
| 800 | const buffer_contents = c.input.buffered(); | 794 | const buffer_contents = c.input.buffered(); |
| 801 | const start = bw.count; | 795 | const start = w.count; |
| 802 | const n = c.tokenizeSlice(bw, limit, buffer_contents) catch |err| switch (err) { | 796 | const n = c.tokenizeSlice(w, limit, buffer_contents) catch |err| switch (err) { |
| 803 | error.WriteFailed => return error.WriteFailed, | 797 | error.WriteFailed => return error.WriteFailed, |
| 804 | }; | 798 | }; |
| 805 | if (buffer_contents.len - n == 0) { | 799 | if (buffer_contents.len - n == 0) { |
| ... | @@ -840,12 +834,12 @@ fn read( | ... | @@ -840,12 +834,12 @@ fn read( |
| 840 | }, | 834 | }, |
| 841 | } | 835 | } |
| 842 | } | 836 | } |
| 843 | return bw.count - start; | 837 | return w.count - start; |
| 844 | }, | 838 | }, |
| 845 | .ended => return error.EndOfStream, | 839 | .ended => return error.EndOfStream, |
| 846 | .footer => |i| { | 840 | .footer => |i| { |
| 847 | const remaining = c.footer_buffer[i..]; | 841 | const remaining = c.footer_buffer[i..]; |
| 848 | const n = try bw.write(limit.slice(remaining)); | 842 | const n = try w.write(limit.slice(remaining)); |
| 849 | c.state = if (n == remaining) .ended else .{ .footer = i - n }; | 843 | c.state = if (n == remaining) .ended else .{ .footer = i - n }; |
| 850 | return n; | 844 | return n; |
| 851 | }, | 845 | }, |
lib/std/compress/flate/Decompress.zig+6-6| ... | @@ -708,7 +708,7 @@ test "decompress" { | ... | @@ -708,7 +708,7 @@ test "decompress" { |
| 708 | 708 | ||
| 709 | var decompress: Decompress = .init(&fb, .raw); | 709 | var decompress: Decompress = .init(&fb, .raw); |
| 710 | var decompress_br = decompress.readable(&.{}); | 710 | var decompress_br = decompress.readable(&.{}); |
| 711 | _ = try decompress_br.readRemaining(&aw.interface); | 711 | _ = try decompress_br.streamRemaining(&aw.interface); |
| 712 | try testing.expectEqualStrings(c.out, aw.getWritten()); | 712 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 713 | } | 713 | } |
| 714 | } | 714 | } |
| ... | @@ -767,7 +767,7 @@ test "gzip decompress" { | ... | @@ -767,7 +767,7 @@ test "gzip decompress" { |
| 767 | 767 | ||
| 768 | var decompress: Decompress = .init(&fb, .gzip); | 768 | var decompress: Decompress = .init(&fb, .gzip); |
| 769 | var decompress_br = decompress.readable(&.{}); | 769 | var decompress_br = decompress.readable(&.{}); |
| 770 | _ = try decompress_br.readRemaining(&aw.interface); | 770 | _ = try decompress_br.streamRemaining(&aw.interface); |
| 771 | try testing.expectEqualStrings(c.out, aw.getWritten()); | 771 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 772 | } | 772 | } |
| 773 | } | 773 | } |
| ... | @@ -795,7 +795,7 @@ test "zlib decompress" { | ... | @@ -795,7 +795,7 @@ test "zlib decompress" { |
| 795 | 795 | ||
| 796 | var decompress: Decompress = .init(&fb, .zlib); | 796 | var decompress: Decompress = .init(&fb, .zlib); |
| 797 | var decompress_br = decompress.readable(&.{}); | 797 | var decompress_br = decompress.readable(&.{}); |
| 798 | _ = try decompress_br.readRemaining(&aw.interface); | 798 | _ = try decompress_br.streamRemaining(&aw.interface); |
| 799 | try testing.expectEqualStrings(c.out, aw.getWritten()); | 799 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 800 | } | 800 | } |
| 801 | } | 801 | } |
| ... | @@ -857,10 +857,10 @@ test "fuzzing tests" { | ... | @@ -857,10 +857,10 @@ test "fuzzing tests" { |
| 857 | var decompress: Decompress = .init(&in, .raw); | 857 | var decompress: Decompress = .init(&in, .raw); |
| 858 | var decompress_br = decompress.readable(&.{}); | 858 | var decompress_br = decompress.readable(&.{}); |
| 859 | if (c.err) |expected_err| { | 859 | if (c.err) |expected_err| { |
| 860 | try testing.expectError(error.ReadFailed, decompress_br.readRemaining(&aw.interface)); | 860 | try testing.expectError(error.ReadFailed, decompress_br.streamRemaining(&aw.interface)); |
| 861 | try testing.expectError(expected_err, decompress.read_err.?); | 861 | try testing.expectError(expected_err, decompress.read_err.?); |
| 862 | } else { | 862 | } else { |
| 863 | _ = try decompress_br.readRemaining(&aw.interface); | 863 | _ = try decompress_br.streamRemaining(&aw.interface); |
| 864 | try testing.expectEqualStrings(c.out, aw.getWritten()); | 864 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 865 | } | 865 | } |
| 866 | } | 866 | } |
| ... | @@ -876,7 +876,7 @@ test "bug 18966" { | ... | @@ -876,7 +876,7 @@ test "bug 18966" { |
| 876 | 876 | ||
| 877 | var decompress: Decompress = .init(&in, .gzip); | 877 | var decompress: Decompress = .init(&in, .gzip); |
| 878 | var decompress_br = decompress.readable(&.{}); | 878 | var decompress_br = decompress.readable(&.{}); |
| 879 | _ = try decompress_br.readRemaining(&aw.interface); | 879 | _ = try decompress_br.streamRemaining(&aw.interface); |
| 880 | try testing.expectEqualStrings(expect, aw.getWritten()); | 880 | try testing.expectEqualStrings(expect, aw.getWritten()); |
| 881 | } | 881 | } |
| 882 | 882 |
lib/std/fs/Dir.zig+3-3| ... | @@ -2030,14 +2030,14 @@ pub fn readFileIntoArrayList( | ... | @@ -2030,14 +2030,14 @@ pub fn readFileIntoArrayList( |
| 2030 | var file = try dir.openFile(file_path, .{}); | 2030 | var file = try dir.openFile(file_path, .{}); |
| 2031 | defer file.close(); | 2031 | defer file.close(); |
| 2032 | 2032 | ||
| 2033 | var file_reader = file.reader(); | 2033 | var file_reader = file.reader(&.{}); |
| 2034 | 2034 | ||
| 2035 | // Apply size hint by adjusting the array list's capacity. | 2035 | // Apply size hint by adjusting the array list's capacity. |
| 2036 | if (size_hint) |size| { | 2036 | if (size_hint) |size| { |
| 2037 | try list.ensureUnusedCapacity(gpa, size); | 2037 | try list.ensureUnusedCapacity(gpa, size); |
| 2038 | file_reader.size = size; | 2038 | file_reader.size = size; |
| 2039 | } else if (file_reader.getSize()) |size| { | 2039 | } else if (file_reader.getSize()) |size| { |
| 2040 | // If the file size doesn't fit a usize it'll be certainly exceed the limit. | 2040 | // If the file size doesn't fit a usize it will certainly exceed the limit. |
| 2041 | try list.ensureUnusedCapacity(gpa, std.math.cast(usize, size) orelse return error.StreamTooLong); | 2041 | try list.ensureUnusedCapacity(gpa, std.math.cast(usize, size) orelse return error.StreamTooLong); |
| 2042 | } else |err| switch (err) { | 2042 | } else |err| switch (err) { |
| 2043 | // Ignore most errors; size hint is only an optimization. | 2043 | // Ignore most errors; size hint is only an optimization. |
| ... | @@ -2045,7 +2045,7 @@ pub fn readFileIntoArrayList( | ... | @@ -2045,7 +2045,7 @@ pub fn readFileIntoArrayList( |
| 2045 | else => |e| return e, | 2045 | else => |e| return e, |
| 2046 | } | 2046 | } |
| 2047 | 2047 | ||
| 2048 | file_reader.interface().readRemainingArrayList(gpa, alignment, list, limit, 128) catch |err| switch (err) { | 2048 | file_reader.interface.appendRemaining(gpa, alignment, list, limit) catch |err| switch (err) { |
| 2049 | error.OutOfMemory => return error.OutOfMemory, | 2049 | error.OutOfMemory => return error.OutOfMemory, |
| 2050 | error.StreamTooLong => return error.StreamTooLong, | 2050 | error.StreamTooLong => return error.StreamTooLong, |
| 2051 | error.ReadFailed => return file_reader.err.?, | 2051 | error.ReadFailed => return file_reader.err.?, |
lib/std/io/Reader.zig+6-9| ... | @@ -170,6 +170,12 @@ pub fn defaultDiscard(r: *Reader, limit: Limit) Error!usize { | ... | @@ -170,6 +170,12 @@ pub fn defaultDiscard(r: *Reader, limit: Limit) Error!usize { |
| 170 | return n; | 170 | return n; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | /// "Pump" exactly `n` bytes from the reader to the writer. | ||
| 174 | pub fn streamExact(r: *Reader, w: *Writer, n: usize) StreamError!void { | ||
| 175 | var remaining = n; | ||
| 176 | while (remaining != 0) remaining -= try r.stream(w, .limited(remaining)); | ||
| 177 | } | ||
| 178 | |||
| 173 | /// "Pump" data from the reader to the writer, handling `error.EndOfStream` as | 179 | /// "Pump" data from the reader to the writer, handling `error.EndOfStream` as |
| 174 | /// a success case. | 180 | /// a success case. |
| 175 | /// | 181 | /// |
| ... | @@ -381,15 +387,6 @@ pub fn readVecAll(r: *Reader, data: [][]u8) Error!void { | ... | @@ -381,15 +387,6 @@ pub fn readVecAll(r: *Reader, data: [][]u8) Error!void { |
| 381 | } | 387 | } |
| 382 | } | 388 | } |
| 383 | 389 | ||
| 384 | /// "Pump" data from the reader to the writer. | ||
| 385 | pub fn readAll(r: *Reader, w: *Writer, limit: Limit) StreamError!void { | ||
| 386 | var remaining = limit; | ||
| 387 | while (remaining.nonzero()) { | ||
| 388 | const n = try r.stream(w, remaining); | ||
| 389 | remaining = remaining.subtract(n).?; | ||
| 390 | } | ||
| 391 | } | ||
| 392 | |||
| 393 | /// Returns the next `len` bytes from the stream, filling the buffer as | 390 | /// Returns the next `len` bytes from the stream, filling the buffer as |
| 394 | /// necessary. | 391 | /// necessary. |
| 395 | /// | 392 | /// |
lib/std/tar.zig+2-2| ... | @@ -381,8 +381,8 @@ pub const Iterator = struct { | ... | @@ -381,8 +381,8 @@ pub const Iterator = struct { |
| 381 | return n; | 381 | return n; |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | pub fn readRemaining(file: *File, out: *std.io.Writer) std.io.Reader.StreamRemainingError!void { | 384 | pub fn streamRemaining(file: *File, out: *std.io.Writer) std.io.Reader.StreamRemainingError!usize { |
| 385 | return file.reader().readRemaining(out); | 385 | return file.reader().streamRemaining(out); |
| 386 | } | 386 | } |
| 387 | }; | 387 | }; |
| 388 | 388 |
lib/std/zip.zig+8-14| ... | @@ -305,8 +305,7 @@ pub const Iterator = struct { | ... | @@ -305,8 +305,7 @@ pub const Iterator = struct { |
| 305 | if (locator_end_offset > stream_len) | 305 | if (locator_end_offset > stream_len) |
| 306 | return error.ZipTruncated; | 306 | return error.ZipTruncated; |
| 307 | try input.seekTo(stream_len - locator_end_offset); | 307 | try input.seekTo(stream_len - locator_end_offset); |
| 308 | var br = input.interface().unbuffered(); | 308 | const locator = input.interface.takeStructEndian(EndLocator64, .little) catch |err| switch (err) { |
| 309 | const locator = br.takeStructEndian(EndLocator64, .little) catch |err| switch (err) { | ||
| 310 | error.ReadFailed => return input.err.?, | 309 | error.ReadFailed => return input.err.?, |
| 311 | error.EndOfStream => return error.EndOfStream, | 310 | error.EndOfStream => return error.EndOfStream, |
| 312 | }; | 311 | }; |
| ... | @@ -319,7 +318,7 @@ pub const Iterator = struct { | ... | @@ -319,7 +318,7 @@ pub const Iterator = struct { |
| 319 | 318 | ||
| 320 | try input.seekTo(locator.record_file_offset); | 319 | try input.seekTo(locator.record_file_offset); |
| 321 | 320 | ||
| 322 | const record64 = br.takeStructEndian(EndRecord64, .little) catch |err| switch (err) { | 321 | const record64 = input.interface.takeStructEndian(EndRecord64, .little) catch |err| switch (err) { |
| 323 | error.ReadFailed => return input.err.?, | 322 | error.ReadFailed => return input.err.?, |
| 324 | error.EndOfStream => return error.EndOfStream, | 323 | error.EndOfStream => return error.EndOfStream, |
| 325 | }; | 324 | }; |
| ... | @@ -375,8 +374,7 @@ pub const Iterator = struct { | ... | @@ -375,8 +374,7 @@ pub const Iterator = struct { |
| 375 | const header_zip_offset = self.cd_zip_offset + self.cd_record_offset; | 374 | const header_zip_offset = self.cd_zip_offset + self.cd_record_offset; |
| 376 | const input = self.input; | 375 | const input = self.input; |
| 377 | try input.seekTo(header_zip_offset); | 376 | try input.seekTo(header_zip_offset); |
| 378 | var br = input.interface().unbuffered(); | 377 | const header = input.interface.takeStructEndian(CentralDirectoryFileHeader, .little) catch |err| switch (err) { |
| 379 | const header = br.takeStructEndian(CentralDirectoryFileHeader, .little) catch |err| switch (err) { | ||
| 380 | error.ReadFailed => return input.err.?, | 378 | error.ReadFailed => return input.err.?, |
| 381 | error.EndOfStream => return error.EndOfStream, | 379 | error.EndOfStream => return error.EndOfStream, |
| 382 | }; | 380 | }; |
| ... | @@ -407,7 +405,7 @@ pub const Iterator = struct { | ... | @@ -407,7 +405,7 @@ pub const Iterator = struct { |
| 407 | const extra = extra_buf[0..header.extra_len]; | 405 | const extra = extra_buf[0..header.extra_len]; |
| 408 | 406 | ||
| 409 | try input.seekTo(header_zip_offset + @sizeOf(CentralDirectoryFileHeader) + header.filename_len); | 407 | try input.seekTo(header_zip_offset + @sizeOf(CentralDirectoryFileHeader) + header.filename_len); |
| 410 | br.readSlice(extra) catch |err| switch (err) { | 408 | input.interface.readSlice(extra) catch |err| switch (err) { |
| 411 | error.ReadFailed => return input.err.?, | 409 | error.ReadFailed => return input.err.?, |
| 412 | error.EndOfStream => return error.EndOfStream, | 410 | error.EndOfStream => return error.EndOfStream, |
| 413 | }; | 411 | }; |
| ... | @@ -472,16 +470,13 @@ pub const Iterator = struct { | ... | @@ -472,16 +470,13 @@ pub const Iterator = struct { |
| 472 | const filename = filename_buf[0..self.filename_len]; | 470 | const filename = filename_buf[0..self.filename_len]; |
| 473 | { | 471 | { |
| 474 | try stream.seekTo(self.header_zip_offset + @sizeOf(CentralDirectoryFileHeader)); | 472 | try stream.seekTo(self.header_zip_offset + @sizeOf(CentralDirectoryFileHeader)); |
| 475 | var stream_br = stream.readable(&.{}); | 473 | try stream.interface.readSlice(filename); |
| 476 | try stream_br.readSlice(filename); | ||
| 477 | } | 474 | } |
| 478 | 475 | ||
| 479 | const local_data_header_offset: u64 = local_data_header_offset: { | 476 | const local_data_header_offset: u64 = local_data_header_offset: { |
| 480 | const local_header = blk: { | 477 | const local_header = blk: { |
| 481 | try stream.seekTo(self.file_offset); | 478 | try stream.seekTo(self.file_offset); |
| 482 | var read_buffer: [@sizeOf(LocalFileHeader)]u8 = undefined; | 479 | break :blk try stream.interface.takeStructEndian(LocalFileHeader, .little); |
| 483 | var stream_br = stream.readable(&read_buffer); | ||
| 484 | break :blk try stream_br.takeStructEndian(LocalFileHeader, .little); | ||
| 485 | }; | 480 | }; |
| 486 | if (!std.mem.eql(u8, &local_header.signature, &local_file_header_sig)) | 481 | if (!std.mem.eql(u8, &local_header.signature, &local_file_header_sig)) |
| 487 | return error.ZipBadFileOffset; | 482 | return error.ZipBadFileOffset; |
| ... | @@ -507,8 +502,7 @@ pub const Iterator = struct { | ... | @@ -507,8 +502,7 @@ pub const Iterator = struct { |
| 507 | 502 | ||
| 508 | { | 503 | { |
| 509 | try stream.seekTo(self.file_offset + @sizeOf(LocalFileHeader) + local_header.filename_len); | 504 | try stream.seekTo(self.file_offset + @sizeOf(LocalFileHeader) + local_header.filename_len); |
| 510 | var stream_br = stream.readable(&.{}); | 505 | try stream.interface.readSlice(extra); |
| 511 | try stream_br.readSlice(extra); | ||
| 512 | } | 506 | } |
| 513 | 507 | ||
| 514 | var extra_offset: usize = 0; | 508 | var extra_offset: usize = 0; |
| ... | @@ -577,7 +571,7 @@ pub const Iterator = struct { | ... | @@ -577,7 +571,7 @@ pub const Iterator = struct { |
| 577 | @as(u64, @sizeOf(LocalFileHeader)) + | 571 | @as(u64, @sizeOf(LocalFileHeader)) + |
| 578 | local_data_header_offset; | 572 | local_data_header_offset; |
| 579 | try stream.seekTo(local_data_file_offset); | 573 | try stream.seekTo(local_data_file_offset); |
| 580 | var limited_file_reader = stream.interface().limited(.limited(self.compressed_size)); | 574 | var limited_file_reader = stream.interface.limited(.limited(self.compressed_size)); |
| 581 | var file_read_buffer: [1000]u8 = undefined; | 575 | var file_read_buffer: [1000]u8 = undefined; |
| 582 | var decompress_read_buffer: [1000]u8 = undefined; | 576 | var decompress_read_buffer: [1000]u8 = undefined; |
| 583 | var limited_br = limited_file_reader.reader().buffered(&file_read_buffer); | 577 | var limited_br = limited_file_reader.reader().buffered(&file_read_buffer); |
lib/std/zip/test.zig+2-4| ... | @@ -63,9 +63,7 @@ fn makeZipWithStore( | ... | @@ -63,9 +63,7 @@ fn makeZipWithStore( |
| 63 | options: WriteZipOptions, | 63 | options: WriteZipOptions, |
| 64 | store: []FileStore, | 64 | store: []FileStore, |
| 65 | ) !void { | 65 | ) !void { |
| 66 | var buffer: [200]u8 = undefined; | 66 | try writeZip(&file_writer.interface, files, store, options); |
| 67 | var bw = file_writer.writer(&buffer); | ||
| 68 | try writeZip(&bw, files, store, options); | ||
| 69 | } | 67 | } |
| 70 | 68 | ||
| 71 | const WriteZipOptions = struct { | 69 | const WriteZipOptions = struct { |
| ... | @@ -201,7 +199,7 @@ const Zipper = struct { | ... | @@ -201,7 +199,7 @@ const Zipper = struct { |
| 201 | var br: std.io.Reader = .fixed(opt.content); | 199 | var br: std.io.Reader = .fixed(opt.content); |
| 202 | var compress: std.compress.flate.Compress = .init(&br, .{}); | 200 | var compress: std.compress.flate.Compress = .init(&br, .{}); |
| 203 | var compress_br = compress.reader(&.{}); | 201 | var compress_br = compress.reader(&.{}); |
| 204 | const n = try compress_br.readRemaining(writer); | 202 | const n = try compress_br.streamRemaining(writer); |
| 205 | assert(br.seek == opt.content.len); | 203 | assert(br.seek == opt.content.len); |
| 206 | try testing.expectEqual(n, writer.count - offset); | 204 | try testing.expectEqual(n, writer.count - offset); |
| 207 | compressed_size = @intCast(n); | 205 | compressed_size = @intCast(n); |