| author | |
| committer | |
| log | f945c2a1c8384319f9588a8f95ff8c97821213fe |
| tree | b2e0661a70603f140bc7a1709e856f111090f4a0 |
| parent | c50f65304f1fd9819fc1e7c0144d5329b6863b9c |
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; | ... | @@ -114,6 +114,7 @@ pub const bufferedWriter = @import("io/buffered_writer.zig").bufferedWriter; |
| 114 | 114 | ||
| 115 | pub const BufferedReader = @import("io/buffered_reader.zig").BufferedReader; | 115 | pub const BufferedReader = @import("io/buffered_reader.zig").BufferedReader; |
| 116 | pub const bufferedReader = @import("io/buffered_reader.zig").bufferedReader; | 116 | pub const bufferedReader = @import("io/buffered_reader.zig").bufferedReader; |
| 117 | pub const bufferedReaderSize = @import("io/buffered_reader.zig").bufferedReaderSize; | ||
| 117 | 118 | ||
| 118 | pub const PeekStream = @import("io/peek_stream.zig").PeekStream; | 119 | pub const PeekStream = @import("io/peek_stream.zig").PeekStream; |
| 119 | pub const peekStream = @import("io/peek_stream.zig").peekStream; | 120 | pub 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 | ... | @@ -45,8 +45,12 @@ pub fn BufferedReader(comptime buffer_size: usize, comptime ReaderType: type) ty |
| 45 | }; | 45 | }; |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | pub fn bufferedReader(underlying_stream: anytype) BufferedReader(4096, @TypeOf(underlying_stream)) { | 48 | pub fn bufferedReader(reader: anytype) BufferedReader(4096, @TypeOf(reader)) { |
| 49 | return .{ .unbuffered_reader = underlying_stream }; | 49 | return .{ .unbuffered_reader = reader }; |
| 50 | } | ||
| 51 | |||
| 52 | pub fn bufferedReaderSize(comptime size: usize, reader: anytype) BufferedReader(size, @TypeOf(reader)) { | ||
| 53 | return .{ .unbuffered_reader = reader }; | ||
| 50 | } | 54 | } |
| 51 | 55 | ||
| 52 | test "io.BufferedReader OneByte" { | 56 | test "io.BufferedReader OneByte" { |
lib/std/io/reader.zig+12-2| ... | @@ -30,10 +30,20 @@ pub fn Reader( | ... | @@ -30,10 +30,20 @@ pub fn Reader( |
| 30 | /// means the stream reached the end. Reaching the end of a stream is not an error | 30 | /// means the stream reached the end. Reaching the end of a stream is not an error |
| 31 | /// condition. | 31 | /// condition. |
| 32 | pub fn readAll(self: Self, buffer: []u8) Error!usize { | 32 | 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); | ||
| 33 | var index: usize = 0; | 43 | var index: usize = 0; |
| 34 | while (index != buffer.len) { | 44 | while (index < len) { |
| 35 | const amt = try self.read(buffer[index..]); | 45 | const amt = try self.read(buffer[index..]); |
| 36 | if (amt == 0) return index; | 46 | if (amt == 0) break; |
| 37 | index += amt; | 47 | index += amt; |
| 38 | } | 48 | } |
| 39 | return index; | 49 | return index; |