summaryrefslogtreecommitdiff
path: root/tnslc/utils
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc/utils')
-rw-r--r--tnslc/utils/algo.tnsl2
-rw-r--r--tnslc/utils/c_wrap_linux.tnsl26
-rw-r--r--tnslc/utils/file.tnsl22
3 files changed, 48 insertions, 2 deletions
diff --git a/tnslc/utils/algo.tnsl b/tnslc/utils/algo.tnsl
index a08c773..73cfb7f 100644
--- a/tnslc/utils/algo.tnsl
+++ b/tnslc/utils/algo.tnsl
@@ -194,7 +194,7 @@
return str
;/
-/; strclone(~uint8 cstr) [~uint8]
+/; strcpy(~uint8 cstr) [~uint8]
Vector out
out.from_cstr(cstr)
return out.as_cstr()
diff --git a/tnslc/utils/c_wrap_linux.tnsl b/tnslc/utils/c_wrap_linux.tnsl
index 814ec1c..1e3155e 100644
--- a/tnslc/utils/c_wrap_linux.tnsl
+++ b/tnslc/utils/c_wrap_linux.tnsl
@@ -1,5 +1,5 @@
# Must be included at the top of the file
-asm "extern malloc, realloc, free, printf, open, close, read, write"
+asm "extern malloc, realloc, free, printf, open, close, read, write, fseek"
{}uint8 _alert = "Alert!\n\0"
{}uint8 _dec = "%d\n\0"
@@ -202,6 +202,30 @@ asm "extern malloc, realloc, free, printf, open, close, read, write"
return out
;/
+/; _fseek (~void handle, uint pos) [int]
+ int out
+
+ # align stack
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ # add buffer zone to stack
+ asm "sub rsp, 128"
+
+ # Call c func
+ asm "mov rdi, r10"
+ asm "mov rsi, r11"
+ asm "mov rdx, 0" # standard value for SEEK_SET as per GNU libc
+ asm "call fseek wrt ..plt"
+
+ # get return value
+ asm "mov r12, rax"
+
+ return out
+;/
+
/; _write_byte (~void handle, ~uint8 byte) [int]
int out
diff --git a/tnslc/utils/file.tnsl b/tnslc/utils/file.tnsl
index 978f31b..22b11f1 100644
--- a/tnslc/utils/file.tnsl
+++ b/tnslc/utils/file.tnsl
@@ -1,6 +1,7 @@
struct File {
Artifact path,
~void handle,
+ uint pos,
bool at_end
}
@@ -14,6 +15,7 @@ struct File {
self.path.split_cstr(str, '/')
self.handle = NULL
self.at_end = false
+ self.pos = 0
;/
/; relative (~uint8 path) [File]
@@ -75,15 +77,35 @@ struct File {
;/
/; 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
;/
+
return out
;/
+ /; unread
+ /; if (self.pos < 1)
+ return
+ ;/
+
+ _fseek(self.handle, self.pos - 1)
+ self.pos = self.pos - 1
+
+ /; if (self.at_end == true)
+ self.at_end = false
+ ;/
+ ;/
+
/; write (uint8 byte)
int written = _write_byte(self.handle, ~byte)
/; if (written == 0)