| author | |
| committer | |
| log | 1501734747afb60c6b28adb0da1e49ff46a31f17 |
| tree | f704e636b67bd1af144017a08a40356ae8f71862 |
| parent | 5d22c588e27e264e16c15fb1639335465e6139e2 |
5 files changed, 23 insertions(+), 14 deletions(-)
lib/std/fs/File.zig+2-1| ... | ... | @@ -1737,9 +1737,10 @@ pub fn writer_writeFile( |
| 1737 | 1737 | const smaller_len = if (len_int == 0) max_count else @min(len_int, max_count); |
| 1738 | 1738 | var off: std.os.linux.off_t = undefined; |
| 1739 | 1739 | const off_ptr: ?*std.os.linux.off_t = if (in_offset.toInt()) |offset| b: { |
| 1740 | off = try std.math.cast(std.os.linux.off_t, offset); | |
| 1740 | off = std.math.cast(std.os.linux.off_t, offset) orelse return error.Overflow; | |
| 1741 | 1741 | break :b &off; |
| 1742 | 1742 | } else null; |
| 1743 | if (true) @panic("TODO"); | |
| 1743 | 1744 | const n = std.os.linux.wrapped.sendfile(out_fd, in_fd, off_ptr, smaller_len) catch |err| switch (err) { |
| 1744 | 1745 | error.UnsupportedOperation => break :sf, |
| 1745 | 1746 | error.Unseekable => break :sf, |
lib/std/io/BufferedReader.zig+11-8| ... | ... | @@ -34,7 +34,7 @@ const eof_reader: std.io.Reader.VTable = .{ |
| 34 | 34 | .streamReadVec = eof_streamReadVec, |
| 35 | 35 | }; |
| 36 | 36 | |
| 37 | fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) anyerror!Reader.Status { | |
| 37 | fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) anyerror!usize { | |
| 38 | 38 | _ = context; |
| 39 | 39 | _ = data; |
| 40 | 40 | _ = splat; |
| ... | ... | @@ -44,11 +44,11 @@ fn eof_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) |
| 44 | 44 | fn eof_writeFile( |
| 45 | 45 | context: ?*anyopaque, |
| 46 | 46 | file: std.fs.File, |
| 47 | offset: u64, | |
| 48 | len: Reader.FileLen, | |
| 47 | offset: std.io.Writer.Offset, | |
| 48 | len: std.io.Writer.FileLen, | |
| 49 | 49 | headers_and_trailers: []const []const u8, |
| 50 | 50 | headers_len: usize, |
| 51 | ) anyerror!Reader.Status { | |
| 51 | ) anyerror!usize { | |
| 52 | 52 | _ = context; |
| 53 | 53 | _ = file; |
| 54 | 54 | _ = offset; |
| ... | ... | @@ -73,14 +73,14 @@ fn eof_posReadVec(ctx: ?*anyopaque, data: []const []u8, offset: u64) anyerror!Re |
| 73 | 73 | return error.EndOfStream; |
| 74 | 74 | } |
| 75 | 75 | |
| 76 | fn eof_streamRead(ctx: ?*anyopaque, bw: *std.io.BufferedWriter, limit: Reader.Limit) Reader.Status { | |
| 76 | fn eof_streamRead(ctx: ?*anyopaque, bw: *std.io.BufferedWriter, limit: Reader.Limit) anyerror!Reader.Status { | |
| 77 | 77 | _ = ctx; |
| 78 | 78 | _ = bw; |
| 79 | 79 | _ = limit; |
| 80 | 80 | return error.EndOfStream; |
| 81 | 81 | } |
| 82 | 82 | |
| 83 | fn eof_streamReadVec(ctx: ?*anyopaque, data: []const []u8) Reader.Status { | |
| 83 | fn eof_streamReadVec(ctx: ?*anyopaque, data: []const []u8) anyerror!Reader.Status { | |
| 84 | 84 | _ = ctx; |
| 85 | 85 | _ = data; |
| 86 | 86 | return error.EndOfStream; |
| ... | ... | @@ -91,13 +91,16 @@ pub fn initFixed(br: *BufferedReader, buffer: []const u8) void { |
| 91 | 91 | br.* = .{ |
| 92 | 92 | .seek = 0, |
| 93 | 93 | .storage = .{ |
| 94 | .buffer = .initBuffer(@constCast(buffer)), | |
| 94 | .buffer = .fromOwnedSlice(@constCast(buffer)), | |
| 95 | 95 | .unbuffered_writer = .{ |
| 96 | 96 | .context = undefined, |
| 97 | 97 | .vtable = &eof_writer, |
| 98 | 98 | }, |
| 99 | 99 | }, |
| 100 | .unbuffered_reader = &.{ .context = undefined, .vtable = &eof_reader }, | |
| 100 | .unbuffered_reader = .{ | |
| 101 | .context = undefined, | |
| 102 | .vtable = &eof_reader, | |
| 103 | }, | |
| 101 | 104 | }; |
| 102 | 105 | } |
| 103 | 106 |
lib/std/io/BufferedWriter.zig+1-1| ... | ... | @@ -50,7 +50,7 @@ pub fn initFixed(bw: *BufferedWriter, buffer: []u8) void { |
| 50 | 50 | .context = bw, |
| 51 | 51 | .vtable = &fixed_vtable, |
| 52 | 52 | }, |
| 53 | .buffer = buffer, | |
| 53 | .buffer = .initBuffer(buffer), | |
| 54 | 54 | }; |
| 55 | 55 | } |
| 56 | 56 |
lib/std/io/Reader.zig+5| ... | ... | @@ -85,6 +85,11 @@ pub fn posReadAll(r: Reader, w: *std.io.BufferedWriter, start_offset: u64) anyer |
| 85 | 85 | } |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | /// Returns total number of bytes written to `w`. | |
| 89 | pub fn streamRead(r: Reader, w: *std.io.BufferedWriter, limit: Limit) anyerror!Status { | |
| 90 | return r.vtable.streamRead.?(r.context, w, limit); | |
| 91 | } | |
| 92 | ||
| 88 | 93 | /// Returns total number of bytes written to `w`. |
| 89 | 94 | pub fn streamReadAll(r: Reader, w: *std.io.BufferedWriter) anyerror!usize { |
| 90 | 95 | const vtable_streamRead = r.vtable.streamRead.?; |
lib/std/io/Writer.zig+4-4| ... | ... | @@ -96,7 +96,7 @@ pub fn writeFile( |
| 96 | 96 | pub fn unimplemented_writeFile( |
| 97 | 97 | context: ?*anyopaque, |
| 98 | 98 | file: std.fs.File, |
| 99 | offset: u64, | |
| 99 | offset: Offset, | |
| 100 | 100 | len: FileLen, |
| 101 | 101 | headers_and_trailers: []const []const u8, |
| 102 | 102 | headers_len: usize, |
| ... | ... | @@ -136,7 +136,7 @@ fn null_writeSplat(context: ?*anyopaque, data: []const []const u8, splat: usize) |
| 136 | 136 | const pattern = data[headers.len..]; |
| 137 | 137 | var written: usize = pattern.len * splat; |
| 138 | 138 | for (headers) |bytes| written += bytes.len; |
| 139 | return .{ .len = written }; | |
| 139 | return written; | |
| 140 | 140 | } |
| 141 | 141 | |
| 142 | 142 | fn null_writeFile( |
| ... | ... | @@ -156,12 +156,12 @@ fn null_writeFile( |
| 156 | 156 | const stat = try file.stat(); |
| 157 | 157 | n += stat.size - off; |
| 158 | 158 | for (headers_and_trailers[headers_len..]) |bytes| n += bytes.len; |
| 159 | return .{ .len = n }; | |
| 159 | return n; | |
| 160 | 160 | } |
| 161 | 161 | @panic("TODO stream from file until eof, counting"); |
| 162 | 162 | } |
| 163 | 163 | for (headers_and_trailers) |bytes| n += bytes.len; |
| 164 | return .{ .len = len.int() + n }; | |
| 164 | return len.int() + n; | |
| 165 | 165 | } |
| 166 | 166 | |
| 167 | 167 | test @"null" { |