summaryrefslogtreecommitdiff
path: root/io/file.tnsl
diff options
context:
space:
mode:
Diffstat (limited to 'io/file.tnsl')
-rw-r--r--io/file.tnsl116
1 files changed, 116 insertions, 0 deletions
diff --git a/io/file.tnsl b/io/file.tnsl
new file mode 100644
index 0000000..2786179
--- /dev/null
+++ b/io/file.tnsl
@@ -0,0 +1,116 @@
+
+# File type
+struct File {
+ # List containing the path
+ Path path,
+ int32 handle,
+ uint pos,
+ bool at_end
+}
+
+/; method File
+ /; init (~uint8 str)
+ self.path.init()
+ self.path.from_cstr(str)
+ self.handle = 0
+ self.handle--
+ self.at_end = false
+ self.pos = 0
+ ;/
+
+ /; relative (~uint8 path) [File]
+ Path rel = self.path.relative(path)
+ ~uint8 new_path = rel.to_cstr()
+ File out
+ out.init(new_path)
+ _delete(new_path)
+ rel.end()
+ return out
+ ;/
+
+ /; end
+ /; if (self.handle + 1 !== 0)
+ _close_file(self.handle)
+ self.handle = 0
+ self.handle--
+ ;/
+ self.path.end()
+ ;/
+
+ /; open
+ ~uint8 p = self.path.to_cstr()
+ self.handle = _open_file(p)
+
+ /; if (self.handle + 1 == 0)
+ self.at_end = true
+ ;/
+ _delete(p)
+ ;/
+
+ /; create
+ ~uint8 p = self.path.to_cstr()
+ self.handle = _create_file(p)
+ /; if (self.handle + 1 == 0)
+ self.at_end = true
+ ;/
+ _delete(p)
+ ;/
+
+ /; close
+ /; if (self.handle + 1 !== 0)
+ _close_file(self.handle)
+ self.handle = 0
+ self.handle--
+ self.at_end = false
+ ;/
+ ;/
+
+ /; read [uint8]
+ /; if (self.at_end == true)
+ return 0
+ ;/
+
+ uint8 out
+ int bytes = _read_byte(self.handle, ~out)
+ self.pos = self.pos + 1
+
+ /; if (bytes == 0)
+ self.at_end = true
+ return 0
+ ;; else if (bytes !== 1)
+ _perror("Error reading from file\0")
+ _print_num("FD: %ld\n\0", self.handle)
+ self.at_end = true
+ return 0
+ ;/
+
+ return out
+ ;/
+
+ /; unread
+ /; if (self.pos < 1)
+ return
+ ;/
+
+ self.pos = self.pos - 1
+ _fseek(self.handle, self.pos)
+
+ /; if (self.at_end == true)
+ self.at_end = false
+ ;/
+ ;/
+
+ /; write (uint8 byte)
+ int written = _write_byte(self.handle, ~byte)
+ /; if (written == 0)
+ self.at_end = true
+ ;/
+ ;/
+
+ /; write_cstr (~uint8 str)
+ /; loop (self.at_end == false && str` !== 0) [str++]
+ self.write(str`)
+ ;/
+ ;/
+
+;/