diff options
| author | hachem <im@hachem.wtf> | 2026-10-08 22:23:55 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-10-08 22:23:55 +0200 |
| commit | 852a5b237116e8b53ae18ea8ea00505e44b40dfe (patch) | |
| tree | 1ed51afcf6471d2a0031d31b67b63f4ec404b9ed /kernel/fs.rv | |
| parent | ef104148057ab98f80b1560405b5c02768457096 (diff) | |
feat: file descriptor and proper stdio
Diffstat (limited to 'kernel/fs.rv')
| -rw-r--r-- | kernel/fs.rv | 18 |
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) |
