authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-06-27 17:46:22-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:30-07:00
logc9915e949ebd4aa0d4d24ef5808ba0b1cff2ecfe
tree88e25116a93a810f1972dbb2b2232fbf41cf1b43
parentbc9db143c9e2beb166c637dd7fc56c4912f93794

std: fix some compilation errors


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 {
287287
288/// For debugging purposes, prints identifying information about this Step.288/// For debugging purposes, prints identifying information about this Step.
289pub fn dump(step: *Step, file: std.fs.File) void {289pub 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();
758758
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);
762762
763 try expand_variables_autoconf_at(&output, contents, values, used);763 try expand_variables_autoconf_at(&output.interface, contents, values, used);
764764
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}
768768
769fn testReplaceVariablesCMake(769fn 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);
669669
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();
169168 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();
283283 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) {
285285 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 stream245 // decompress compressed stream to decompressed stream
247 {246 {
...@@ -450,12 +449,15 @@ test "gzip header" {...@@ -450,12 +449,15 @@ test "gzip header" {
450}449}
451450
452test "public interface" {451test "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 };
454453
455 // deflate final stored block, header + plain (stored) data454 // 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, nlen456 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;
459461
460 //// gzip header/footer + deflate block462 //// 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 // TODO473 // 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();
475476
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
481fn 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;
484479
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 // decompress485 // decompress
486 {486 {
487 var plain: Writer = .fixed(&buffer2);487 var plain: Writer = .fixed(&buffer2);
488488
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 }
493493
...@@ -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);
498498
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, .{});
501501
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 }
506506
...@@ -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);
511511
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();
516516
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);
529529
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);
532532
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 }
537537
...@@ -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);
542542
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();
547547
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);
560560
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);
563563
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 }
568568
...@@ -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);
573573
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();
578578
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;
48const mem = std.mem;48const mem = std.mem;
49const math = std.math;49const math = std.math;
50const Writer = std.io.Writer;50const Writer = std.io.Writer;
51const Reader = std.io.Reader;
5152
52const Compress = @This();53const Compress = @This();
53const Token = @import("Token.zig");54const Token = @import("Token.zig");
...@@ -64,20 +65,13 @@ input: *std.io.Reader,...@@ -64,20 +65,13 @@ input: *std.io.Reader,
64block_writer: BlockWriter,65block_writer: BlockWriter,
65level: LevelArgs,66level: LevelArgs,
66hasher: Container.Hasher,67hasher: Container.Hasher,
68reader: std.io.Reader,
6769
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.
70prev_match: ?Token = null,72prev_match: ?Token = null,
71prev_literal: ?u8 = null,73prev_literal: ?u8 = null,
7274
73pub fn reader(c: *Compress, buffer: []u8) std.io.Reader {
74 return .{
75 .context = c,
76 .vtable = .{ .read = read },
77 .buffer = buffer,
78 };
79}
80
81pub const Options = struct {75pub 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};
127121
128pub fn init(input: *std.io.Reader, options: Options) Compress {122pub 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}
137135
...@@ -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}
760758
761fn read(759fn 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" {
708708
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" {
767767
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" {
795795
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" {
876876
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}
882882
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();
20322032
2033 var file_reader = file.reader();2033 var file_reader = file.reader(&.{});
20342034
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 }
20472047
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}
172172
173/// "Pump" exactly `n` bytes from the reader to the writer.
174pub 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` as179/// "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}
383389
384/// "Pump" data from the reader to the writer.
385pub 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 as390/// 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 }
383383
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 };
388388
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 {
319318
320 try input.seekTo(locator.record_file_offset);319 try input.seekTo(locator.record_file_offset);
321320
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];
408406
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 }
478475
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 {
507502
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 }
513507
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}
7068
71const WriteZipOptions = struct {69const 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);