Function readVec [src]
Writes bytes from the internally tracked stream position to data.
Returns the number of bytes written, which will be at minimum 0 and
at most the sum of each data slice length. The number of bytes read,
including zero, does not indicate end of stream.
The reader's internal logical seek position moves forward in accordance
with the number of bytes returned from this function.
Prototype
pub fn readVec(r: *Reader, data: [][]u8) Error!usize
Parameters
r: *Reader
data: [][]u8
Possible Errors
See the Reader
implementation for detailed diagnostics.
Example
test readVec {
var r: Reader = .fixed(std.ascii.letters);
var flat_buffer: [52]u8 = undefined;
var bufs: [2][]u8 = .{
flat_buffer[0..26],
flat_buffer[26..],
};
// Short reads are possible with this function but not with fixed.
try testing.expectEqual(26 * 2, try r.readVec(&bufs));
try testing.expectEqualStrings(std.ascii.letters[0..26], bufs[0]);
try testing.expectEqualStrings(std.ascii.letters[26..], bufs[1]);
}
Source
pub fn readVec(r: *Reader, data: [][]u8) Error!usize {
var seek = r.seek;
for (data, 0..) |buf, i| {
const contents = r.buffer[seek..r.end];
const copy_len = @min(contents.len, buf.len);
@memcpy(buf[0..copy_len], contents[0..copy_len]);
seek += copy_len;
if (buf.len - copy_len == 0) continue;
// All of `buffer` has been copied to `data`.
const n = seek - r.seek;
r.seek = seek;
data[i] = buf[copy_len..];
defer data[i] = buf;
return n + (r.vtable.readVec(r, data[i..]) catch |err| switch (err) {
error.EndOfStream => if (n == 0) return error.EndOfStream else 0,
error.ReadFailed => return error.ReadFailed,
});
}
const n = seek - r.seek;
r.seek = seek;
return n;
}