authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-09 22:33:26-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-11 15:39:48-08:00
logf945c2a1c8384319f9588a8f95ff8c97821213fe
treeb2e0661a70603f140bc7a1709e856f111090f4a0
parentc50f65304f1fd9819fc1e7c0144d5329b6863b9c

expose std.io.bufferedReaderSize

This allows setting a custom buffer size. In this case I wanted it because using a buffer size large enough to fit a TLS ciphertext record elides a memcpy(). This commit also adds `readAtLeast` to the Reader interface.

3 files changed, 19 insertions(+), 4 deletions(-)

lib/std/io.zig+1
......@@ -114,6 +114,7 @@ pub const bufferedWriter = @import("io/buffered_writer.zig").bufferedWriter;
114114
115115pub const BufferedReader = @import("io/buffered_reader.zig").BufferedReader;
116116pub const bufferedReader = @import("io/buffered_reader.zig").bufferedReader;
117pub const bufferedReaderSize = @import("io/buffered_reader.zig").bufferedReaderSize;
117118
118119pub const PeekStream = @import("io/peek_stream.zig").PeekStream;
119120pub const peekStream = @import("io/peek_stream.zig").peekStream;
lib/std/io/buffered_reader.zig+6-2
......@@ -45,8 +45,12 @@ pub fn BufferedReader(comptime buffer_size: usize, comptime ReaderType: type) ty
4545 };
4646}
4747
48pub fn bufferedReader(underlying_stream: anytype) BufferedReader(4096, @TypeOf(underlying_stream)) {
49 return .{ .unbuffered_reader = underlying_stream };
48pub fn bufferedReader(reader: anytype) BufferedReader(4096, @TypeOf(reader)) {
49 return .{ .unbuffered_reader = reader };
50}
51
52pub fn bufferedReaderSize(comptime size: usize, reader: anytype) BufferedReader(size, @TypeOf(reader)) {
53 return .{ .unbuffered_reader = reader };
5054}
5155
5256test "io.BufferedReader OneByte" {
lib/std/io/reader.zig+12-2
......@@ -30,10 +30,20 @@ pub fn Reader(
3030 /// means the stream reached the end. Reaching the end of a stream is not an error
3131 /// condition.
3232 pub fn readAll(self: Self, buffer: []u8) Error!usize {
33 return readAtLeast(self, buffer, 1);
34 }
35
36 /// Returns the number of bytes read, calling the underlying read
37 /// function the minimal number of times until the buffer has at least
38 /// `len` bytes filled. If the number read is less than `len` it means
39 /// the stream reached the end. Reaching the end of the stream is not
40 /// an error condition.
41 pub fn readAtLeast(self: Self, buffer: []u8, len: usize) Error!usize {
42 assert(len <= buffer.len);
3343 var index: usize = 0;
34 while (index != buffer.len) {
44 while (index < len) {
3545 const amt = try self.read(buffer[index..]);
36 if (amt == 0) return index;
46 if (amt == 0) break;
3747 index += amt;
3848 }
3949 return index;