| author | |
| committer | |
| log | bb1bf5b96f966696f88933a07513b001c99d66f5 |
| tree | d805f8095c127998e0a22b432a475e49ffe33f95 |
| parent | 1e81c3a9259873fac197ed5dc6e2133f0a097243 |
3 files changed, 33 insertions(+), 20 deletions(-)
lib/std/Io.zig+2-1| ... | ... | @@ -667,7 +667,8 @@ pub const VTable = struct { |
| 667 | 667 | dirOpenFile: *const fn (?*anyopaque, Dir, sub_path: []const u8, File.OpenFlags) File.OpenError!File, |
| 668 | 668 | fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat, |
| 669 | 669 | fileClose: *const fn (?*anyopaque, File) void, |
| 670 | pwrite: *const fn (?*anyopaque, File, buffer: []const u8, offset: std.posix.off_t) File.PWriteError!usize, | |
| 670 | fileWriteStreaming: *const fn (?*anyopaque, File, buffer: [][]const u8) File.WriteStreamingError!usize, | |
| 671 | fileWritePositional: *const fn (?*anyopaque, File, buffer: [][]const u8, offset: u64) File.WritePositionalError!usize, | |
| 671 | 672 | /// Returns 0 on end of stream. |
| 672 | 673 | fileReadStreaming: *const fn (?*anyopaque, File, data: [][]u8) File.ReadStreamingError!usize, |
| 673 | 674 | /// Returns 0 on end of stream. |
lib/std/Io/File.zig+6-11| ... | ... | @@ -172,24 +172,19 @@ pub const ReadStreamingError = error{ |
| 172 | 172 | pub const ReadPositionalError = ReadStreamingError || error{Unseekable}; |
| 173 | 173 | |
| 174 | 174 | pub fn readPositional(file: File, io: Io, buffer: []u8, offset: u64) ReadPositionalError!usize { |
| 175 | return io.vtable.pread(io.userdata, file, buffer, offset); | |
| 175 | return io.vtable.fileReadPositional(io.userdata, file, buffer, offset); | |
| 176 | 176 | } |
| 177 | 177 | |
| 178 | pub const WriteError = std.fs.File.WriteError || Io.Cancelable; | |
| 178 | pub const WriteStreamingError = error{} || Io.UnexpectedError || Io.Cancelable; | |
| 179 | 179 | |
| 180 | pub fn write(file: File, io: Io, buffer: []const u8) WriteError!usize { | |
| 180 | pub fn write(file: File, io: Io, buffer: []const u8) WriteStreamingError!usize { | |
| 181 | 181 | return @errorCast(file.pwrite(io, buffer, -1)); |
| 182 | 182 | } |
| 183 | 183 | |
| 184 | pub fn writeAll(file: File, io: Io, bytes: []const u8) WriteError!void { | |
| 185 | var index: usize = 0; | |
| 186 | while (index < bytes.len) index += try file.write(io, bytes[index..]); | |
| 187 | } | |
| 188 | ||
| 189 | pub const PWriteError = std.fs.File.PWriteError || Io.Cancelable; | |
| 184 | pub const WritePositionalError = WriteStreamingError || error{Unseekable}; | |
| 190 | 185 | |
| 191 | pub fn pwrite(file: File, io: Io, buffer: []const u8, offset: std.posix.off_t) PWriteError!usize { | |
| 192 | return io.vtable.pwrite(io.userdata, file, buffer, offset); | |
| 186 | pub fn writePositional(file: File, io: Io, buffer: []const u8, offset: u64) WritePositionalError!usize { | |
| 187 | return io.vtable.fileWritePositional(io.userdata, file, buffer, offset); | |
| 193 | 188 | } |
| 194 | 189 | |
| 195 | 190 | pub fn openAbsolute(io: Io, absolute_path: []const u8, flags: OpenFlags) OpenError!File { |
lib/std/Io/Threaded.zig+25-8| ... | ... | @@ -190,7 +190,8 @@ pub fn io(t: *Threaded) Io { |
| 190 | 190 | }, |
| 191 | 191 | .dirOpenFile = dirOpenFile, |
| 192 | 192 | .fileClose = fileClose, |
| 193 | .pwrite = pwrite, | |
| 193 | .fileWriteStreaming = fileWriteStreaming, | |
| 194 | .fileWritePositional = fileWritePositional, | |
| 194 | 195 | .fileReadStreaming = fileReadStreaming, |
| 195 | 196 | .fileReadPositional = fileReadPositional, |
| 196 | 197 | .fileSeekBy = fileSeekBy, |
| ... | ... | @@ -1611,14 +1612,30 @@ fn fileSeekTo(userdata: ?*anyopaque, file: Io.File, offset: u64) Io.File.SeekErr |
| 1611 | 1612 | } |
| 1612 | 1613 | } |
| 1613 | 1614 | |
| 1614 | fn pwrite(userdata: ?*anyopaque, file: Io.File, buffer: []const u8, offset: posix.off_t) Io.File.PWriteError!usize { | |
| 1615 | fn fileWritePositional( | |
| 1616 | userdata: ?*anyopaque, | |
| 1617 | file: Io.File, | |
| 1618 | buffer: [][]const u8, | |
| 1619 | offset: u64, | |
| 1620 | ) Io.File.WritePositionalError!usize { | |
| 1615 | 1621 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 1616 | try t.checkCancel(); | |
| 1617 | const fs_file: std.fs.File = .{ .handle = file.handle }; | |
| 1618 | return switch (offset) { | |
| 1619 | -1 => fs_file.write(buffer), | |
| 1620 | else => fs_file.pwrite(buffer, @bitCast(offset)), | |
| 1621 | }; | |
| 1622 | while (true) { | |
| 1623 | try t.checkCancel(); | |
| 1624 | _ = file; | |
| 1625 | _ = buffer; | |
| 1626 | _ = offset; | |
| 1627 | @panic("TODO"); | |
| 1628 | } | |
| 1629 | } | |
| 1630 | ||
| 1631 | fn fileWriteStreaming(userdata: ?*anyopaque, file: Io.File, buffer: [][]const u8) Io.File.WriteStreamingError!usize { | |
| 1632 | const t: *Threaded = @ptrCast(@alignCast(userdata)); | |
| 1633 | while (true) { | |
| 1634 | try t.checkCancel(); | |
| 1635 | _ = file; | |
| 1636 | _ = buffer; | |
| 1637 | @panic("TODO"); | |
| 1638 | } | |
| 1622 | 1639 | } |
| 1623 | 1640 | |
| 1624 | 1641 | fn nowPosix(userdata: ?*anyopaque, clock: Io.Clock) Io.Clock.Error!Io.Timestamp { |