hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs.rv
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-10-08 22:23:55 +0200
committerhachem <im@hachem.wtf>2026-10-08 22:23:55 +0200
commit852a5b237116e8b53ae18ea8ea00505e44b40dfe (patch)
tree1ed51afcf6471d2a0031d31b67b63f4ec404b9ed /kernel/fs.rv
parentef104148057ab98f80b1560405b5c02768457096 (diff)
feat: file descriptor and proper stdio
Diffstat (limited to 'kernel/fs.rv')
-rw-r--r--kernel/fs.rv18
1 files changed, 18 insertions, 0 deletions
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)