From 852a5b237116e8b53ae18ea8ea00505e44b40dfe Mon Sep 17 00:00:00 2001 From: hachem Date: Thu, 8 Oct 2026 22:23:55 +0200 Subject: feat: file descriptor and proper stdio --- kernel/fs.rv | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'kernel/fs.rv') diff --git a/kernel/fs.rv b/kernel/fs.rv index 23ccd78..1e72dc4 100644 --- a/kernel/fs.rv +++ b/kernel/fs.rv @@ -346,6 +346,23 @@ global fs = { return entry.size end, + # TODO: ts needs a rewrite its not cheap and rewrites every file from scratch + write_at = fn(self, path, offset, bytes) do + const size = self:size(path) + let base = "" + if size > 0 do base = self:read_bytes(path, 0, size) end + let prefix = "" + if offset <= base:len() do prefix = base[0..offset] end + else do + prefix = base + while prefix:len() < offset do prefix = prefix ~ string.of_ascii(0) end + end + const after = offset + bytes:len() + let tail = "" + if after < base:len() do tail = base[after..] end + return self:store(path, prefix ~ bytes ~ tail) + end, + cat = fn(self, path) do if self:ensure() == :false return :nil const entry = self:resolve(path) @@ -444,3 +461,4 @@ global fs = { global fs_store = fn(name, text) fs:store(name, text) global fs_size = fn(name) fs:size(name) global fs_read_bytes = fn(name, offset, length) fs:read_bytes(name, offset, length) +global fs_write_at = fn(name, offset, bytes) fs:write_at(name, offset, bytes) -- cgit v1.3