Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › Io/ › File/ › Reader.zig › discard
discard
Reader.discard
fn discard (io_reader : *Io .Reader , limit : Io .Limit ) Io .Reader .Error !usize
File
Code
fn discard (io_reader : *Io .Reader , limit : Io .Limit ) Io .Reader .Error !usize {
const r : *Reader = @alignCast (@fieldParentPtr ("interface" , io_reader ));
const io = r .io ;
const file = r .file ;
switch (r .mode ) {
.positional , .positional_simple => {
const size = r .getSize () catch {
r .mode = r .mode .toStreaming ();
return 0 ;
};
const logical_pos = logicalPos (r );
const bytes_remaining = size - logical_pos ;
if (bytes_remaining == 0 ) return error .EndOfStream ;
const delta = @min (@backingInt (limit ), bytes_remaining );
setLogicalPos (r , logical_pos + delta );
return delta ;
},
.streaming , .streaming_simple => {
// size because the seek syscalls provided to us will not
// return the true end position if a seek would exceed the
// end.
fallback : {
if (r .size_err == null and r .seek_err == null ) break :fallback ;
const buffered_len = r .interface .bufferedLen ();
var remaining = @backingInt (limit );
if (remaining <= buffered_len ) {
r .interface .seek += remaining ;
return remaining ;
}
remaining -= buffered_len ;
r .interface .seek = 0 ;
r .interface .end = 0 ;
var trash_buffer : [128 ]u8 = undefined ;
var data : [1 ][]u8 = .{trash_buffer [0 ..@min (trash_buffer .len , remaining )]};
var iovecs_buffer : [max_buffers_len ][]u8 = undefined ;
const dest_n , const data_size = try r .interface .writableVector (&iovecs_buffer , &data );
const dest = iovecs_buffer [0 ..dest_n ];
assert (dest [0 ].len > 0 );
const n = file .readStreaming (io , dest ) catch |err | switch (err ) {
error .EndOfStream => {
r .size = r .pos ;
return error .EndOfStream ;
},
else => |e | {
r .err = e ;
return error .ReadFailed ;
},
};
r .pos += n ;
if (n > data_size ) {
r .interface .end += n - data_size ;
remaining -= data_size ;
} else {
remaining -= n ;
}
return @backingInt (limit ) - remaining ;
}
const size = r .getSize () catch return 0 ;
const n = @min (size - r .pos , std .math .maxInt (i64 ), @backingInt (limit ));
io .vtable .fileSeekBy (io .userdata , file , n ) catch |err | {
r .seek_err = err ;
return 0 ;
};
r .pos += n ;
return n ;
},
.failure => return error .ReadFailed ,
}
}