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: *Readerdata: [][]u8

Possible Errors

EndOfStream
ReadFailed

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; }