Skip to content

Commit bc8e1a7

Browse files
authored
Merge pull request #24523 from ziglang/fifno
std.tar: update to new I/O API
2 parents 2365392 + 4fcb479 commit bc8e1a7

21 files changed

+1046
-1463
lines changed

CMakeLists.txt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -390,15 +390,6 @@ set(ZIG_STAGE2_SOURCES
390390
lib/std/Io.zig
391391
lib/std/Io/Reader.zig
392392
lib/std/Io/Writer.zig
393-
lib/std/Io/buffered_atomic_file.zig
394-
lib/std/Io/buffered_writer.zig
395-
lib/std/Io/change_detection_stream.zig
396-
lib/std/Io/counting_reader.zig
397-
lib/std/Io/counting_writer.zig
398-
lib/std/Io/find_byte_writer.zig
399-
lib/std/Io/fixed_buffer_stream.zig
400-
lib/std/Io/limited_reader.zig
401-
lib/std/Io/seekable_stream.zig
402393
lib/std/Progress.zig
403394
lib/std/Random.zig
404395
lib/std/Target.zig

lib/compiler/std-docs.zig

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ pub fn main() !void {
6060
const should_open_browser = force_open_browser orelse (listen_port == 0);
6161

6262
const address = std.net.Address.parseIp("127.0.0.1", listen_port) catch unreachable;
63-
var http_server = try address.listen(.{});
63+
var http_server = try address.listen(.{
64+
.reuse_address = true,
65+
});
6466
const port = http_server.listen_address.in.getPort();
6567
const url_with_newline = try std.fmt.allocPrint(arena, "http://127.0.0.1:{d}/\n", .{port});
6668
std.fs.File.stdout().writeAll(url_with_newline) catch {};
@@ -189,7 +191,11 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void {
189191
var walker = try std_dir.walk(gpa);
190192
defer walker.deinit();
191193

192-
var archiver = std.tar.writer(response.writer());
194+
var adapter_buffer: [500]u8 = undefined;
195+
var response_writer = response.writer().adaptToNewApi();
196+
response_writer.new_interface.buffer = &adapter_buffer;
197+
198+
var archiver: std.tar.Writer = .{ .underlying_writer = &response_writer.new_interface };
193199
archiver.prefix = "std";
194200

195201
while (try walker.next()) |entry| {
@@ -204,7 +210,13 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void {
204210
}
205211
var file = try entry.dir.openFile(entry.basename, .{});
206212
defer file.close();
207-
try archiver.writeFile(entry.path, file);
213+
const stat = try file.stat();
214+
var file_reader: std.fs.File.Reader = .{
215+
.file = file,
216+
.interface = std.fs.File.Reader.initInterface(&.{}),
217+
.size = stat.size,
218+
};
219+
try archiver.writeFile(entry.path, &file_reader, stat.mtime);
208220
}
209221

210222
{

lib/docs/wasm/main.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -772,10 +772,10 @@ export fn decl_type_html(decl_index: Decl.Index) String {
772772
const Oom = error{OutOfMemory};
773773

774774
fn unpackInner(tar_bytes: []u8) !void {
775-
var fbs = std.io.fixedBufferStream(tar_bytes);
775+
var reader: std.Io.Reader = .fixed(tar_bytes);
776776
var file_name_buffer: [1024]u8 = undefined;
777777
var link_name_buffer: [1024]u8 = undefined;
778-
var it = std.tar.iterator(fbs.reader(), .{
778+
var it: std.tar.Iterator = .init(&reader, .{
779779
.file_name_buffer = &file_name_buffer,
780780
.link_name_buffer = &link_name_buffer,
781781
});
@@ -796,7 +796,7 @@ fn unpackInner(tar_bytes: []u8) !void {
796796
{
797797
gop.value_ptr.* = file;
798798
}
799-
const file_bytes = tar_bytes[fbs.pos..][0..@intCast(tar_file.size)];
799+
const file_bytes = tar_bytes[reader.seek..][0..@intCast(tar_file.size)];
800800
assert(file == try Walk.add_file(file_name, file_bytes));
801801
}
802802
} else {

lib/std/Build/Fuzz/WebServer.zig

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -522,21 +522,24 @@ fn serveSourcesTar(ws: *WebServer, request: *std.http.Server.Request) !void {
522522

523523
var cwd_cache: ?[]const u8 = null;
524524

525-
var archiver = std.tar.writer(response.writer());
525+
var adapter = response.writer().adaptToNewApi();
526+
var archiver: std.tar.Writer = .{ .underlying_writer = &adapter.new_interface };
527+
var read_buffer: [1024]u8 = undefined;
526528

527529
for (deduped_paths) |joined_path| {
528530
var file = joined_path.root_dir.handle.openFile(joined_path.sub_path, .{}) catch |err| {
529531
log.err("failed to open {f}: {s}", .{ joined_path, @errorName(err) });
530532
continue;
531533
};
532534
defer file.close();
533-
535+
const stat = try file.stat();
536+
var file_reader: std.fs.File.Reader = .initSize(file, &read_buffer, stat.size);
534537
archiver.prefix = joined_path.root_dir.path orelse try memoizedCwd(arena, &cwd_cache);
535-
try archiver.writeFile(joined_path.sub_path, file);
538+
try archiver.writeFile(joined_path.sub_path, &file_reader, stat.mtime);
536539
}
537540

538-
// intentionally omitting the pointless trailer
539-
//try archiver.finish();
541+
// intentionally not calling `archiver.finishPedantically`
542+
try adapter.new_interface.flush();
540543
try response.end();
541544
}
542545

lib/std/Io.zig

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,11 @@ pub fn GenericReader(
314314
}
315315

316316
/// Helper for bridging to the new `Reader` API while upgrading.
317-
pub fn adaptToNewApi(self: *const Self) Adapter {
317+
pub fn adaptToNewApi(self: *const Self, buffer: []u8) Adapter {
318318
return .{
319319
.derp_reader = self.*,
320320
.new_interface = .{
321-
.buffer = &.{},
321+
.buffer = buffer,
322322
.vtable = &.{ .stream = Adapter.stream },
323323
.seek = 0,
324324
.end = 0,
@@ -334,10 +334,12 @@ pub fn GenericReader(
334334
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
335335
const a: *@This() = @alignCast(@fieldParentPtr("new_interface", r));
336336
const buf = limit.slice(try w.writableSliceGreedy(1));
337-
return a.derp_reader.read(buf) catch |err| {
337+
const n = a.derp_reader.read(buf) catch |err| {
338338
a.err = err;
339339
return error.ReadFailed;
340340
};
341+
w.advance(n);
342+
return n;
341343
}
342344
};
343345
};
@@ -419,9 +421,14 @@ pub fn GenericWriter(
419421
new_interface: Writer,
420422
err: ?Error = null,
421423

422-
fn drain(w: *Writer, data: []const []const u8, splat: usize) Writer.Error!usize {
424+
fn drain(w: *std.io.Writer, data: []const []const u8, splat: usize) std.io.Writer.Error!usize {
423425
_ = splat;
424426
const a: *@This() = @alignCast(@fieldParentPtr("new_interface", w));
427+
const buffered = w.buffered();
428+
if (buffered.len != 0) return w.consume(a.derp_writer.write(buffered) catch |err| {
429+
a.err = err;
430+
return error.WriteFailed;
431+
});
425432
return a.derp_writer.write(data[0]) catch |err| {
426433
a.err = err;
427434
return error.WriteFailed;
@@ -435,54 +442,46 @@ pub fn GenericWriter(
435442
pub const AnyReader = @import("Io/DeprecatedReader.zig");
436443
/// Deprecated in favor of `Writer`.
437444
pub const AnyWriter = @import("Io/DeprecatedWriter.zig");
438-
445+
/// Deprecated in favor of `File.Reader` and `File.Writer`.
439446
pub const SeekableStream = @import("Io/seekable_stream.zig").SeekableStream;
440-
447+
/// Deprecated in favor of `Writer`.
441448
pub const BufferedWriter = @import("Io/buffered_writer.zig").BufferedWriter;
449+
/// Deprecated in favor of `Writer`.
442450
pub const bufferedWriter = @import("Io/buffered_writer.zig").bufferedWriter;
443-
451+
/// Deprecated in favor of `Reader`.
444452
pub const BufferedReader = @import("Io/buffered_reader.zig").BufferedReader;
453+
/// Deprecated in favor of `Reader`.
445454
pub const bufferedReader = @import("Io/buffered_reader.zig").bufferedReader;
455+
/// Deprecated in favor of `Reader`.
446456
pub const bufferedReaderSize = @import("Io/buffered_reader.zig").bufferedReaderSize;
447-
457+
/// Deprecated in favor of `Reader`.
448458
pub const FixedBufferStream = @import("Io/fixed_buffer_stream.zig").FixedBufferStream;
459+
/// Deprecated in favor of `Reader`.
449460
pub const fixedBufferStream = @import("Io/fixed_buffer_stream.zig").fixedBufferStream;
450-
451-
pub const CWriter = @import("Io/c_writer.zig").CWriter;
452-
pub const cWriter = @import("Io/c_writer.zig").cWriter;
453-
461+
/// Deprecated in favor of `Reader.Limited`.
454462
pub const LimitedReader = @import("Io/limited_reader.zig").LimitedReader;
463+
/// Deprecated in favor of `Reader.Limited`.
455464
pub const limitedReader = @import("Io/limited_reader.zig").limitedReader;
456-
465+
/// Deprecated with no replacement; inefficient pattern
457466
pub const CountingWriter = @import("Io/counting_writer.zig").CountingWriter;
467+
/// Deprecated with no replacement; inefficient pattern
458468
pub const countingWriter = @import("Io/counting_writer.zig").countingWriter;
469+
/// Deprecated with no replacement; inefficient pattern
459470
pub const CountingReader = @import("Io/counting_reader.zig").CountingReader;
471+
/// Deprecated with no replacement; inefficient pattern
460472
pub const countingReader = @import("Io/counting_reader.zig").countingReader;
461473

462-
pub const MultiWriter = @import("Io/multi_writer.zig").MultiWriter;
463-
pub const multiWriter = @import("Io/multi_writer.zig").multiWriter;
464-
465474
pub const BitReader = @import("Io/bit_reader.zig").BitReader;
466475
pub const bitReader = @import("Io/bit_reader.zig").bitReader;
467476

468477
pub const BitWriter = @import("Io/bit_writer.zig").BitWriter;
469478
pub const bitWriter = @import("Io/bit_writer.zig").bitWriter;
470479

471-
pub const ChangeDetectionStream = @import("Io/change_detection_stream.zig").ChangeDetectionStream;
472-
pub const changeDetectionStream = @import("Io/change_detection_stream.zig").changeDetectionStream;
473-
474-
pub const FindByteWriter = @import("Io/find_byte_writer.zig").FindByteWriter;
475-
pub const findByteWriter = @import("Io/find_byte_writer.zig").findByteWriter;
476-
477-
pub const BufferedAtomicFile = @import("Io/buffered_atomic_file.zig").BufferedAtomicFile;
478-
479-
pub const StreamSource = @import("Io/stream_source.zig").StreamSource;
480-
481480
pub const tty = @import("Io/tty.zig");
482481

483-
/// A Writer that doesn't write to anything.
482+
/// Deprecated in favor of `Writer.Discarding`.
484483
pub const null_writer: NullWriter = .{ .context = {} };
485-
484+
/// Deprecated in favor of `Writer.Discarding`.
486485
pub const NullWriter = GenericWriter(void, error{}, dummyWrite);
487486
fn dummyWrite(context: void, data: []const u8) error{}!usize {
488487
_ = context;
@@ -898,16 +897,14 @@ test {
898897
_ = Reader;
899898
_ = Reader.Limited;
900899
_ = Writer;
901-
_ = @import("Io/bit_reader.zig");
902-
_ = @import("Io/bit_writer.zig");
903-
_ = @import("Io/buffered_atomic_file.zig");
904-
_ = @import("Io/buffered_reader.zig");
905-
_ = @import("Io/buffered_writer.zig");
906-
_ = @import("Io/c_writer.zig");
907-
_ = @import("Io/counting_writer.zig");
908-
_ = @import("Io/counting_reader.zig");
909-
_ = @import("Io/fixed_buffer_stream.zig");
910-
_ = @import("Io/seekable_stream.zig");
911-
_ = @import("Io/stream_source.zig");
900+
_ = BitReader;
901+
_ = BitWriter;
902+
_ = BufferedReader;
903+
_ = BufferedWriter;
904+
_ = CountingWriter;
905+
_ = CountingReader;
906+
_ = FixedBufferStream;
907+
_ = SeekableStream;
908+
_ = tty;
912909
_ = @import("Io/test.zig");
913910
}

lib/std/Io/DeprecatedReader.zig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,10 +393,12 @@ pub const Adapter = struct {
393393
fn stream(r: *std.io.Reader, w: *std.io.Writer, limit: std.io.Limit) std.io.Reader.StreamError!usize {
394394
const a: *@This() = @alignCast(@fieldParentPtr("new_interface", r));
395395
const buf = limit.slice(try w.writableSliceGreedy(1));
396-
return a.derp_reader.read(buf) catch |err| {
396+
const n = a.derp_reader.read(buf) catch |err| {
397397
a.err = err;
398398
return error.ReadFailed;
399399
};
400+
w.advance(n);
401+
return n;
400402
}
401403
};
402404

lib/std/Io/DeprecatedWriter.zig

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,12 @@ pub const Adapter = struct {
100100

101101
fn drain(w: *std.io.Writer, data: []const []const u8, splat: usize) std.io.Writer.Error!usize {
102102
_ = splat;
103-
const a: *@This() = @fieldParentPtr("new_interface", w);
103+
const a: *@This() = @alignCast(@fieldParentPtr("new_interface", w));
104+
const buffered = w.buffered();
105+
if (buffered.len != 0) return w.consume(a.derp_writer.write(buffered) catch |err| {
106+
a.err = err;
107+
return error.WriteFailed;
108+
});
104109
return a.derp_writer.write(data[0]) catch |err| {
105110
a.err = err;
106111
return error.WriteFailed;

lib/std/Io/Reader.zig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@ pub fn streamExact(r: *Reader, w: *Writer, n: usize) StreamError!void {
179179
while (remaining != 0) remaining -= try r.stream(w, .limited(remaining));
180180
}
181181

182+
/// "Pump" exactly `n` bytes from the reader to the writer.
183+
pub fn streamExact64(r: *Reader, w: *Writer, n: u64) StreamError!void {
184+
var remaining = n;
185+
while (remaining != 0) remaining -= try r.stream(w, .limited64(remaining));
186+
}
187+
182188
/// "Pump" data from the reader to the writer, handling `error.EndOfStream` as
183189
/// a success case.
184190
///

lib/std/Io/buffered_atomic_file.zig

Lines changed: 0 additions & 55 deletions
This file was deleted.

lib/std/Io/c_writer.zig

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)