mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
* lib/std/io/stream: add some inlines Signed-off-by: Pierre Curto <pierre.curto@gmail.com> * lib/std/io/stream add ByteBuffer Signed-off-by: Pierre Curto <pierre.curto@gmail.com> * lib/std/io/path: fix free of paths in walk Signed-off-by: Pierre Curto <pierre.curto@gmail.com> * lib/std/bits: remove unnecessary receiver type Signed-off-by: Pierre Curto <pierre.curto@gmail.com> --------- Signed-off-by: Pierre Curto <pierre.curto@gmail.com>
36 lines
733 B
C
36 lines
733 B
C
module std::io::stream;
|
|
|
|
struct LimitReader
|
|
{
|
|
Stream reader;
|
|
usz limit;
|
|
}
|
|
|
|
fn void LimitReader.init(&self, Stream reader, usz limit)
|
|
{
|
|
*self = { .reader = reader, .limit = limit };
|
|
}
|
|
|
|
fn usz! LimitReader.read(&self, char[] bytes)
|
|
{
|
|
if (self.limit == 0) return IoError.EOF?;
|
|
usz m = min(bytes.len, self.limit);
|
|
usz n = self.reader.read(bytes[:m])!;
|
|
self.limit -= n;
|
|
return n;
|
|
}
|
|
|
|
fn Stream LimitReader.as_stream(&self)
|
|
{
|
|
return { .fns = &limitreader_interface, .data = self };
|
|
}
|
|
|
|
fn usz LimitReader.available(&self) @inline
|
|
{
|
|
return self.limit;
|
|
}
|
|
|
|
StreamInterface limitreader_interface = {
|
|
.read_fn = fn(s, char[] bytes) => ((LimitReader*)s.data).read(bytes),
|
|
.available_fn = fn(s) => ((LimitReader*)s.data).available(),
|
|
}; |