hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/io.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/io.rv
parentef104148057ab98f80b1560405b5c02768457096 (diff)
feat: file descriptor and proper stdio
Diffstat (limited to 'kernel/io.rv')
-rw-r--r--kernel/io.rv37
1 files changed, 37 insertions, 0 deletions
diff --git a/kernel/io.rv b/kernel/io.rv
new file mode 100644
index 0000000..68b7039
--- /dev/null
+++ b/kernel/io.rv
@@ -0,0 +1,37 @@
+# stdio stuff
+
+global io = {
+ open = fn(self, path, mode) do
+ if mode == "w" do fs:store(path, "") end
+ let offset = 0
+ if mode == "a" do
+ const size = fs:size(path)
+ if size > 0 do offset = size end
+ end
+ return { path = path, offset = offset }
+ end,
+
+ read = fn(self, handle, count) do
+ const data = fs:read_bytes(handle.path, handle.offset, count)
+ handle.offset += data:len()
+ return data
+ end,
+
+ read_all = fn(self, handle) do
+ const size = fs:size(handle.path)
+ if size <= handle.offset return ""
+ const data = fs:read_bytes(handle.path, handle.offset, size - handle.offset)
+ handle.offset += data:len()
+ return data
+ end,
+
+ write = fn(self, handle, data) do
+ fs:write_at(handle.path, handle.offset, data)
+ handle.offset += data:len()
+ return data:len()
+ end,
+
+ seek = fn(self, handle, offset) do handle.offset = offset end,
+ tell = fn(self, handle) handle.offset,
+ close = fn(self, handle) :nil,
+}