From b531c0e6769fc89e4028600dae1cbfef1dc89a7f Mon Sep 17 00:00:00 2001 From: daurnimator Date: Sat, 25 Apr 2020 20:34:47 +1000 Subject: [PATCH] std: add instream.readBytesNoEof function --- lib/std/io/in_stream.zig | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/std/io/in_stream.zig b/lib/std/io/in_stream.zig index 2a03ba3037..a67a5cf8e2 100644 --- a/lib/std/io/in_stream.zig +++ b/lib/std/io/in_stream.zig @@ -184,35 +184,38 @@ pub fn InStream( return @bitCast(i8, try self.readByte()); } + /// Reads exactly `num_bytes` bytes and returns as an array. + /// `num_bytes` must be comptime-known + pub fn readBytesNoEof(self: Self, comptime num_bytes: usize) ![num_bytes]u8 { + var bytes: [num_bytes]u8 = undefined; + try self.readNoEof(&bytes); + return bytes; + } + /// Reads a native-endian integer pub fn readIntNative(self: Self, comptime T: type) !T { - var bytes: [(T.bit_count + 7) / 8]u8 = undefined; - try self.readNoEof(bytes[0..]); + const bytes = try self.readBytesNoEof((T.bit_count + 7) / 8); return mem.readIntNative(T, &bytes); } /// Reads a foreign-endian integer pub fn readIntForeign(self: Self, comptime T: type) !T { - var bytes: [(T.bit_count + 7) / 8]u8 = undefined; - try self.readNoEof(bytes[0..]); + const bytes = try self.readBytesNoEof((T.bit_count + 7) / 8); return mem.readIntForeign(T, &bytes); } pub fn readIntLittle(self: Self, comptime T: type) !T { - var bytes: [(T.bit_count + 7) / 8]u8 = undefined; - try self.readNoEof(bytes[0..]); + const bytes = try self.readBytesNoEof((T.bit_count + 7) / 8); return mem.readIntLittle(T, &bytes); } pub fn readIntBig(self: Self, comptime T: type) !T { - var bytes: [(T.bit_count + 7) / 8]u8 = undefined; - try self.readNoEof(bytes[0..]); + const bytes = try self.readBytesNoEof((T.bit_count + 7) / 8); return mem.readIntBig(T, &bytes); } pub fn readInt(self: Self, comptime T: type, endian: builtin.Endian) !T { - var bytes: [(T.bit_count + 7) / 8]u8 = undefined; - try self.readNoEof(bytes[0..]); + const bytes = try self.readBytesNoEof((T.bit_count + 7) / 8); return mem.readInt(T, &bytes, endian); }