| 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 | 2802 | src_builder: *Build, |
| 2803 | 2803 | asking_step: ?*Step, |
| 2804 | 2804 | ) anyerror!void { |
| 2805 | var fw = stderr.writer(); | |
| 2806 | var bw = fw.interface().unbuffered(); | |
| 2805 | var fw = stderr.writer(&.{}); | |
| 2806 | const bw = &fw.interface; | |
| 2807 | 2807 | try bw.print( |
| 2808 | 2808 | \\getPath() was called on a GeneratedFile that wasn't built yet. |
| 2809 | 2809 | \\ source package path: {s} |
lib/std/Build/Cache.zig+2-2| ... | ... | @@ -661,9 +661,9 @@ pub const Manifest = struct { |
| 661 | 661 | } { |
| 662 | 662 | const gpa = self.cache.gpa; |
| 663 | 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 | 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 | 667 | error.OutOfMemory => return error.OutOfMemory, |
| 668 | 668 | error.StreamTooLong => return error.OutOfMemory, |
| 669 | 669 | error.ReadFailed => { |
lib/std/Build/Step.zig+2-2| ... | ... | @@ -287,8 +287,8 @@ pub fn cast(step: *Step, comptime T: type) ?*T { |
| 287 | 287 | |
| 288 | 288 | /// For debugging purposes, prints identifying information about this Step. |
| 289 | 289 | pub fn dump(step: *Step, file: std.fs.File) void { |
| 290 | var fw = file.writer(); | |
| 291 | var bw = fw.interface().unbuffered(); | |
| 290 | var fw = file.writer(&.{}); | |
| 291 | const bw = &fw.interface; | |
| 292 | 292 | const tty_config = std.io.tty.detectConfig(file); |
| 293 | 293 | const debug_info = std.debug.getSelfDebugInfo() catch |err| { |
| 294 | 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 | 753 | expected: []const u8, |
| 754 | 754 | values: std.StringArrayHashMap(Value), |
| 755 | 755 | ) !void { |
| 756 | var output: std.ArrayList(u8) = .init(allocator); | |
| 756 | var output: std.io.Writer.Allocating = .init(allocator); | |
| 757 | 757 | defer output.deinit(); |
| 758 | 758 | |
| 759 | 759 | const used = try allocator.alloc(bool, values.count()); |
| 760 | 760 | for (used) |*u| u.* = false; |
| 761 | 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 | 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 | 769 | fn testReplaceVariablesCMake( |
lib/std/Build/Step/Options.zig+1-1| ... | ... | @@ -667,5 +667,5 @@ test Options { |
| 667 | 667 | \\ |
| 668 | 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 | 163 | } else { |
| 164 | 164 | var buf: [32]u8 = undefined; |
| 165 | 165 | const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); |
| 166 | ||
| 167 | 166 | const file = try std.fs.cwd().openFile(path, .{ .mode = .write_only }); |
| 168 | 167 | defer file.close(); |
| 169 | ||
| 170 | try file.writer().writeAll(name); | |
| 168 | var fw = file.writer(&.{}); | |
| 169 | fw.interface.writeAll(name) catch |err| switch (err) { | |
| 170 | error.WriteFailed => return fw.err.?, | |
| 171 | }; | |
| 171 | 172 | return; |
| 172 | 173 | }, |
| 173 | 174 | .windows => { |
| ... | ... | @@ -277,13 +278,13 @@ pub fn getName(self: Thread, buffer_ptr: *[max_name_len:0]u8) GetNameError!?[]co |
| 277 | 278 | } else { |
| 278 | 279 | var buf: [32]u8 = undefined; |
| 279 | 280 | const path = try std.fmt.bufPrint(&buf, "/proc/self/task/{d}/comm", .{self.getHandle()}); |
| 280 | ||
| 281 | 281 | const file = try std.fs.cwd().openFile(path, .{}); |
| 282 | 282 | defer file.close(); |
| 283 | ||
| 284 | const data_len = try file.reader().readAll(buffer_ptr[0 .. max_name_len + 1]); | |
| 285 | ||
| 286 | return if (data_len >= 1) buffer[0 .. data_len - 1] else null; | |
| 283 | var fr = file.reader(&.{}); | |
| 284 | const n = fr.interface.readSliceShort(buffer_ptr[0 .. max_name_len + 1]) catch |err| switch (err) { | |
| 285 | error.ReadFailed => return fr.err.?, | |
| 286 | }; | |
| 287 | return if (n == 0) null else buffer[0 .. n - 1]; | |
| 287 | 288 | }, |
| 288 | 289 | .windows => { |
| 289 | 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 | 232 | { |
| 233 | 233 | var original: std.io.Reader = .fixed(data); |
| 234 | 234 | var compressed: Writer = .fixed(&cmp_buf); |
| 235 | var compress: Compress = .init(&original, .raw); | |
| 236 | var compress_br = compress.readable(&.{}); | |
| 237 | const n = try compress_br.readRemaining(&compressed, .{ .level = level }); | |
| 235 | var compress: Compress = .init(&original, &.{}, .{ .container = .raw, .level = level }); | |
| 236 | const n = try compress.reader.streamRemaining(&compressed); | |
| 238 | 237 | if (compressed_size == 0) { |
| 239 | 238 | if (container == .gzip) |
| 240 | 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 | 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 | 245 | // decompress compressed stream to decompressed stream |
| 247 | 246 | { |
| ... | ... | @@ -450,12 +449,15 @@ test "gzip header" { |
| 450 | 449 | } |
| 451 | 450 | |
| 452 | 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 | 454 | // deflate final stored block, header + plain (stored) data |
| 456 | 455 | const deflate_block = [_]u8{ |
| 457 | 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 | 462 | //// gzip header/footer + deflate block |
| 461 | 463 | //const gzip_data = |
| ... | ... | @@ -471,23 +473,21 @@ test "public interface" { |
| 471 | 473 | // TODO |
| 472 | 474 | //const gzip = @import("gzip.zig"); |
| 473 | 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 | 477 | var buffer1: [64]u8 = undefined; |
| 483 | 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 | 485 | // decompress |
| 486 | 486 | { |
| 487 | 487 | var plain: Writer = .fixed(&buffer2); |
| 488 | 488 | |
| 489 | 489 | var in: std.io.Reader = .fixed(gzip_data); |
| 490 | try pkg.decompress(&in, &plain); | |
| 490 | try decompress(&in, &plain); | |
| 491 | 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 | 497 | var compressed: Writer = .fixed(&buffer1); |
| 498 | 498 | |
| 499 | 499 | var in: std.io.Reader = .fixed(plain_data); |
| 500 | try pkg.compress(&in, &compressed, .{}); | |
| 500 | try compress(&in, &compressed, .{}); | |
| 501 | 501 | |
| 502 | 502 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 503 | try pkg.decompress(&compressed_br, &plain); | |
| 503 | try decompress(&compressed_br, &plain); | |
| 504 | 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 | 510 | var compressed: Writer = .fixed(&buffer1); |
| 511 | 511 | |
| 512 | 512 | var in: std.io.Reader = .fixed(plain_data); |
| 513 | var cmp = try pkg.compressor(&compressed, .{}); | |
| 513 | var cmp = try Compress(&compressed, .{}); | |
| 514 | 514 | try cmp.compress(&in); |
| 515 | 515 | try cmp.finish(); |
| 516 | 516 | |
| 517 | 517 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 518 | var dcp = pkg.decompressor(&compressed_br); | |
| 518 | var dcp = Decompress(&compressed_br); | |
| 519 | 519 | try dcp.decompress(&plain); |
| 520 | 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 | 528 | var compressed: Writer = .fixed(&buffer1); |
| 529 | 529 | |
| 530 | 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 | 533 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 534 | try pkg.decompress(&compressed_br, &plain); | |
| 534 | try decompress(&compressed_br, &plain); | |
| 535 | 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 | 541 | var compressed: Writer = .fixed(&buffer1); |
| 542 | 542 | |
| 543 | 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 | 545 | try cmp.compress(&in); |
| 546 | 546 | try cmp.finish(); |
| 547 | 547 | |
| 548 | 548 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 549 | try pkg.decompress(&compressed_br, &plain); | |
| 549 | try decompress(&compressed_br, &plain); | |
| 550 | 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 | 559 | var compressed: Writer = .fixed(&buffer1); |
| 560 | 560 | |
| 561 | 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 | 564 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 565 | try pkg.decompress(&compressed_br, &plain); | |
| 565 | try decompress(&compressed_br, &plain); | |
| 566 | 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 | 572 | var compressed: Writer = .fixed(&buffer1); |
| 573 | 573 | |
| 574 | 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 | 576 | try cmp.compress(&in); |
| 577 | 577 | try cmp.finish(); |
| 578 | 578 | |
| 579 | 579 | var compressed_br: std.io.Reader = .fixed(&buffer1); |
| 580 | try pkg.decompress(&compressed_br, &plain); | |
| 580 | try decompress(&compressed_br, &plain); | |
| 581 | 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 | 48 | const mem = std.mem; |
| 49 | 49 | const math = std.math; |
| 50 | 50 | const Writer = std.io.Writer; |
| 51 | const Reader = std.io.Reader; | |
| 51 | 52 | |
| 52 | 53 | const Compress = @This(); |
| 53 | 54 | const Token = @import("Token.zig"); |
| ... | ... | @@ -64,20 +65,13 @@ input: *std.io.Reader, |
| 64 | 65 | block_writer: BlockWriter, |
| 65 | 66 | level: LevelArgs, |
| 66 | 67 | hasher: Container.Hasher, |
| 68 | reader: std.io.Reader, | |
| 67 | 69 | |
| 68 | 70 | // Match and literal at the previous position. |
| 69 | 71 | // Used for lazy match finding in processWindow. |
| 70 | 72 | prev_match: ?Token = null, |
| 71 | 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 | 75 | pub const Options = struct { |
| 82 | 76 | level: Level = .default, |
| 83 | 77 | container: Container = .raw, |
| ... | ... | @@ -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 | 123 | return .{ |
| 130 | 124 | .input = input, |
| 131 | 125 | .block_writer = undefined, |
| 132 | 126 | .level = .get(options.level), |
| 133 | 127 | .hasher = .init(options.container), |
| 134 | 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 | 756 | return a.freq < b.freq; |
| 759 | 757 | } |
| 760 | 758 | |
| 761 | fn read( | |
| 762 | context: ?*anyopaque, | |
| 763 | bw: *Writer, | |
| 764 | limit: std.io.Limit, | |
| 765 | ) std.io.Reader.StreamError!usize { | |
| 766 | const c: *Compress = @ptrCast(@alignCast(context)); | |
| 759 | fn stream(r: *Reader, w: *Writer, limit: std.io.Limit) Reader.StreamError!usize { | |
| 760 | const c: *Compress = @fieldParentPtr("reader", r); | |
| 767 | 761 | switch (c.state) { |
| 768 | 762 | .header => |i| { |
| 769 | 763 | const header = c.hasher.container().header(); |
| 770 | const n = try bw.write(header[i..]); | |
| 764 | const n = try w.write(header[i..]); | |
| 771 | 765 | if (header.len - i - n == 0) { |
| 772 | 766 | c.state = .middle; |
| 773 | 767 | } else { |
| ... | ... | @@ -788,18 +782,18 @@ fn read( |
| 788 | 782 | const history_plus_lookahead_len = flate.history_len + min_lookahead; |
| 789 | 783 | if (buffer_contents.len < history_plus_lookahead_len) return 0; |
| 790 | 784 | const lookahead = buffer_contents[flate.history_len..]; |
| 791 | const start = bw.count; | |
| 792 | const n = try c.tokenizeSlice(bw, limit, lookahead) catch |err| switch (err) { | |
| 785 | const start = w.count; | |
| 786 | const n = try c.tokenizeSlice(w, limit, lookahead) catch |err| switch (err) { | |
| 793 | 787 | error.WriteFailed => return error.WriteFailed, |
| 794 | 788 | }; |
| 795 | 789 | c.hasher.update(lookahead[0..n]); |
| 796 | 790 | c.input.toss(n); |
| 797 | return bw.count - start; | |
| 791 | return w.count - start; | |
| 798 | 792 | }, |
| 799 | 793 | .final => { |
| 800 | 794 | const buffer_contents = c.input.buffered(); |
| 801 | const start = bw.count; | |
| 802 | const n = c.tokenizeSlice(bw, limit, buffer_contents) catch |err| switch (err) { | |
| 795 | const start = w.count; | |
| 796 | const n = c.tokenizeSlice(w, limit, buffer_contents) catch |err| switch (err) { | |
| 803 | 797 | error.WriteFailed => return error.WriteFailed, |
| 804 | 798 | }; |
| 805 | 799 | if (buffer_contents.len - n == 0) { |
| ... | ... | @@ -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 | 839 | .ended => return error.EndOfStream, |
| 846 | 840 | .footer => |i| { |
| 847 | 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 | 843 | c.state = if (n == remaining) .ended else .{ .footer = i - n }; |
| 850 | 844 | return n; |
| 851 | 845 | }, |
lib/std/compress/flate/Decompress.zig+6-6| ... | ... | @@ -708,7 +708,7 @@ test "decompress" { |
| 708 | 708 | |
| 709 | 709 | var decompress: Decompress = .init(&fb, .raw); |
| 710 | 710 | var decompress_br = decompress.readable(&.{}); |
| 711 | _ = try decompress_br.readRemaining(&aw.interface); | |
| 711 | _ = try decompress_br.streamRemaining(&aw.interface); | |
| 712 | 712 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 713 | 713 | } |
| 714 | 714 | } |
| ... | ... | @@ -767,7 +767,7 @@ test "gzip decompress" { |
| 767 | 767 | |
| 768 | 768 | var decompress: Decompress = .init(&fb, .gzip); |
| 769 | 769 | var decompress_br = decompress.readable(&.{}); |
| 770 | _ = try decompress_br.readRemaining(&aw.interface); | |
| 770 | _ = try decompress_br.streamRemaining(&aw.interface); | |
| 771 | 771 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 772 | 772 | } |
| 773 | 773 | } |
| ... | ... | @@ -795,7 +795,7 @@ test "zlib decompress" { |
| 795 | 795 | |
| 796 | 796 | var decompress: Decompress = .init(&fb, .zlib); |
| 797 | 797 | var decompress_br = decompress.readable(&.{}); |
| 798 | _ = try decompress_br.readRemaining(&aw.interface); | |
| 798 | _ = try decompress_br.streamRemaining(&aw.interface); | |
| 799 | 799 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 800 | 800 | } |
| 801 | 801 | } |
| ... | ... | @@ -857,10 +857,10 @@ test "fuzzing tests" { |
| 857 | 857 | var decompress: Decompress = .init(&in, .raw); |
| 858 | 858 | var decompress_br = decompress.readable(&.{}); |
| 859 | 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 | 861 | try testing.expectError(expected_err, decompress.read_err.?); |
| 862 | 862 | } else { |
| 863 | _ = try decompress_br.readRemaining(&aw.interface); | |
| 863 | _ = try decompress_br.streamRemaining(&aw.interface); | |
| 864 | 864 | try testing.expectEqualStrings(c.out, aw.getWritten()); |
| 865 | 865 | } |
| 866 | 866 | } |
| ... | ... | @@ -876,7 +876,7 @@ test "bug 18966" { |
| 876 | 876 | |
| 877 | 877 | var decompress: Decompress = .init(&in, .gzip); |
| 878 | 878 | var decompress_br = decompress.readable(&.{}); |
| 879 | _ = try decompress_br.readRemaining(&aw.interface); | |
| 879 | _ = try decompress_br.streamRemaining(&aw.interface); | |
| 880 | 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 | 2030 | var file = try dir.openFile(file_path, .{}); |
| 2031 | 2031 | defer file.close(); |
| 2032 | 2032 | |
| 2033 | var file_reader = file.reader(); | |
| 2033 | var file_reader = file.reader(&.{}); | |
| 2034 | 2034 | |
| 2035 | 2035 | // Apply size hint by adjusting the array list's capacity. |
| 2036 | 2036 | if (size_hint) |size| { |
| 2037 | 2037 | try list.ensureUnusedCapacity(gpa, size); |
| 2038 | 2038 | file_reader.size = size; |
| 2039 | 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 | 2041 | try list.ensureUnusedCapacity(gpa, std.math.cast(usize, size) orelse return error.StreamTooLong); |
| 2042 | 2042 | } else |err| switch (err) { |
| 2043 | 2043 | // Ignore most errors; size hint is only an optimization. |
| ... | ... | @@ -2045,7 +2045,7 @@ pub fn readFileIntoArrayList( |
| 2045 | 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 | 2049 | error.OutOfMemory => return error.OutOfMemory, |
| 2050 | 2050 | error.StreamTooLong => return error.StreamTooLong, |
| 2051 | 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 | 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 | 179 | /// "Pump" data from the reader to the writer, handling `error.EndOfStream` as |
| 174 | 180 | /// a success case. |
| 175 | 181 | /// |
| ... | ... | @@ -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 | 390 | /// Returns the next `len` bytes from the stream, filling the buffer as |
| 394 | 391 | /// necessary. |
| 395 | 392 | /// |
lib/std/tar.zig+2-2| ... | ... | @@ -381,8 +381,8 @@ pub const Iterator = struct { |
| 381 | 381 | return n; |
| 382 | 382 | } |
| 383 | 383 | |
| 384 | pub fn readRemaining(file: *File, out: *std.io.Writer) std.io.Reader.StreamRemainingError!void { | |
| 385 | return file.reader().readRemaining(out); | |
| 384 | pub fn streamRemaining(file: *File, out: *std.io.Writer) std.io.Reader.StreamRemainingError!usize { | |
| 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 | 305 | if (locator_end_offset > stream_len) |
| 306 | 306 | return error.ZipTruncated; |
| 307 | 307 | try input.seekTo(stream_len - locator_end_offset); |
| 308 | var br = input.interface().unbuffered(); | |
| 309 | const locator = br.takeStructEndian(EndLocator64, .little) catch |err| switch (err) { | |
| 308 | const locator = input.interface.takeStructEndian(EndLocator64, .little) catch |err| switch (err) { | |
| 310 | 309 | error.ReadFailed => return input.err.?, |
| 311 | 310 | error.EndOfStream => return error.EndOfStream, |
| 312 | 311 | }; |
| ... | ... | @@ -319,7 +318,7 @@ pub const Iterator = struct { |
| 319 | 318 | |
| 320 | 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 | 322 | error.ReadFailed => return input.err.?, |
| 324 | 323 | error.EndOfStream => return error.EndOfStream, |
| 325 | 324 | }; |
| ... | ... | @@ -375,8 +374,7 @@ pub const Iterator = struct { |
| 375 | 374 | const header_zip_offset = self.cd_zip_offset + self.cd_record_offset; |
| 376 | 375 | const input = self.input; |
| 377 | 376 | try input.seekTo(header_zip_offset); |
| 378 | var br = input.interface().unbuffered(); | |
| 379 | const header = br.takeStructEndian(CentralDirectoryFileHeader, .little) catch |err| switch (err) { | |
| 377 | const header = input.interface.takeStructEndian(CentralDirectoryFileHeader, .little) catch |err| switch (err) { | |
| 380 | 378 | error.ReadFailed => return input.err.?, |
| 381 | 379 | error.EndOfStream => return error.EndOfStream, |
| 382 | 380 | }; |
| ... | ... | @@ -407,7 +405,7 @@ pub const Iterator = struct { |
| 407 | 405 | const extra = extra_buf[0..header.extra_len]; |
| 408 | 406 | |
| 409 | 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 | 409 | error.ReadFailed => return input.err.?, |
| 412 | 410 | error.EndOfStream => return error.EndOfStream, |
| 413 | 411 | }; |
| ... | ... | @@ -472,16 +470,13 @@ pub const Iterator = struct { |
| 472 | 470 | const filename = filename_buf[0..self.filename_len]; |
| 473 | 471 | { |
| 474 | 472 | try stream.seekTo(self.header_zip_offset + @sizeOf(CentralDirectoryFileHeader)); |
| 475 | var stream_br = stream.readable(&.{}); | |
| 476 | try stream_br.readSlice(filename); | |
| 473 | try stream.interface.readSlice(filename); | |
| 477 | 474 | } |
| 478 | 475 | |
| 479 | 476 | const local_data_header_offset: u64 = local_data_header_offset: { |
| 480 | 477 | const local_header = blk: { |
| 481 | 478 | try stream.seekTo(self.file_offset); |
| 482 | var read_buffer: [@sizeOf(LocalFileHeader)]u8 = undefined; | |
| 483 | var stream_br = stream.readable(&read_buffer); | |
| 484 | break :blk try stream_br.takeStructEndian(LocalFileHeader, .little); | |
| 479 | break :blk try stream.interface.takeStructEndian(LocalFileHeader, .little); | |
| 485 | 480 | }; |
| 486 | 481 | if (!std.mem.eql(u8, &local_header.signature, &local_file_header_sig)) |
| 487 | 482 | return error.ZipBadFileOffset; |
| ... | ... | @@ -507,8 +502,7 @@ pub const Iterator = struct { |
| 507 | 502 | |
| 508 | 503 | { |
| 509 | 504 | try stream.seekTo(self.file_offset + @sizeOf(LocalFileHeader) + local_header.filename_len); |
| 510 | var stream_br = stream.readable(&.{}); | |
| 511 | try stream_br.readSlice(extra); | |
| 505 | try stream.interface.readSlice(extra); | |
| 512 | 506 | } |
| 513 | 507 | |
| 514 | 508 | var extra_offset: usize = 0; |
| ... | ... | @@ -577,7 +571,7 @@ pub const Iterator = struct { |
| 577 | 571 | @as(u64, @sizeOf(LocalFileHeader)) + |
| 578 | 572 | local_data_header_offset; |
| 579 | 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 | 575 | var file_read_buffer: [1000]u8 = undefined; |
| 582 | 576 | var decompress_read_buffer: [1000]u8 = undefined; |
| 583 | 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 | 63 | options: WriteZipOptions, |
| 64 | 64 | store: []FileStore, |
| 65 | 65 | ) !void { |
| 66 | var buffer: [200]u8 = undefined; | |
| 67 | var bw = file_writer.writer(&buffer); | |
| 68 | try writeZip(&bw, files, store, options); | |
| 66 | try writeZip(&file_writer.interface, files, store, options); | |
| 69 | 67 | } |
| 70 | 68 | |
| 71 | 69 | const WriteZipOptions = struct { |
| ... | ... | @@ -201,7 +199,7 @@ const Zipper = struct { |
| 201 | 199 | var br: std.io.Reader = .fixed(opt.content); |
| 202 | 200 | var compress: std.compress.flate.Compress = .init(&br, .{}); |
| 203 | 201 | var compress_br = compress.reader(&.{}); |
| 204 | const n = try compress_br.readRemaining(writer); | |
| 202 | const n = try compress_br.streamRemaining(writer); | |
| 205 | 203 | assert(br.seek == opt.content.len); |
| 206 | 204 | try testing.expectEqual(n, writer.count - offset); |
| 207 | 205 | compressed_size = @intCast(n); |