summaryrefslogtreecommitdiff
path: root/tnslc/utils
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc/utils')
-rw-r--r--tnslc/utils/c_wrap_linux.tnsl228
-rw-r--r--tnslc/utils/c_wrap_windows.tnsl284
-rw-r--r--tnslc/utils/file.tnsl17
-rw-r--r--tnslc/utils/utils.tnsl2
4 files changed, 528 insertions, 3 deletions
diff --git a/tnslc/utils/c_wrap_linux.tnsl b/tnslc/utils/c_wrap_linux.tnsl
new file mode 100644
index 0000000..814ec1c
--- /dev/null
+++ b/tnslc/utils/c_wrap_linux.tnsl
@@ -0,0 +1,228 @@
+# Must be included at the top of the file
+asm "extern malloc, realloc, free, printf, open, close, read, write"
+
+{}uint8 _alert = "Alert!\n\0"
+{}uint8 _dec = "%d\n\0"
+{}uint8 _ptr = "%p\n\0"
+
+~void NULL = 0
+
+/; _alloc (uint size) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Mov size into proper register, and set all extras to zero
+ asm "mov rdi, r10"
+ asm "mov rsi, 0"
+ asm "xor rax, rax"
+
+ # Do call
+ asm "call malloc wrt ..plt"
+
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially, and we have a uint in r10)
+ asm "mov r11, rax"
+
+ return out
+;/
+
+/; _realloc (~void ptr, uint new_size) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Mov ptr and new size into proper registers, and set all extras to zero
+ asm "mov rdi, r10"
+ asm "mov rsi, r11"
+ asm "xor rax, rax"
+
+ # Do call
+ asm "call realloc wrt ..plt"
+
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially. We have a ptr in r10, and a uint in r11)
+ asm "mov r12, rax"
+
+ return out
+;/
+
+/; _delete (~void ptr)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # setup call by clearing most values
+ asm "mov rdi, r10"
+ asm "mov rsi, 0"
+ asm "xor rax, rax"
+
+ # do call
+ asm "call free wrt ..plt"
+
+ # there's no more to do 'cause free returns nothing
+;/
+
+/; _printf (~void str)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # setup call by clearing most values
+ asm "mov rdi, r10"
+ asm "xor rsi, rsi"
+ asm "xor rax, rax"
+
+ # do call
+ asm "call printf wrt ..plt"
+
+ # there's no more to do 'cause printf returns nothing
+;/
+
+/; _print_num (~void str, int num)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # setup call by clearing most values
+ asm "mov rdi, r10"
+ asm "mov rsi, r11"
+ asm "xor rax, rax"
+
+ # do call
+ asm "call printf wrt ..plt"
+
+ # there's no more to do 'cause printf returns nothing
+;/
+
+
+# Create file for writing (overwrite)
+/; _create_file (~void name) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Do call
+ asm "mov rdi, r10"
+ asm "mov rsi, 0q1102"
+ asm "mov rdx, 0q700"
+ asm "call open wrt ..plt"
+
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially. We have a ptr in r8)
+ asm "mov r11, rax"
+
+ return out
+;/
+
+# Open file for reading or writing (no overwrite)
+/; _open_file (~void name) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Do syscall
+ asm "mov rdi, r10"
+ asm "mov rsi, 2"
+ asm "mov rdx, 0q700"
+ asm "call open wrt ..plt"
+
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9)
+ asm "mov r11, rax"
+
+ return out
+;/
+
+/; _close_file (~void handle)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Do syscall
+ asm "mov rdi, r10"
+ asm "call close wrt ..plt"
+;/
+
+/; _read_byte (~void handle, ~uint8 byte) [int]
+ int out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Do syscall
+ asm "mov rdi, r10" # handle
+ asm "mov rsi, r11" # buffer
+ asm "mov rdx, 1" # one byte
+ asm "call read wrt ..plt"
+
+ # return number of bytes read
+ asm "mov r12, rax"
+
+ return out
+;/
+
+/; _write_byte (~void handle, ~uint8 byte) [int]
+ int out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 16"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 128"
+
+ # Do syscall
+ asm "mov rdi, r10" # handle
+ asm "mov rsi, r11" # buffer
+ asm "mov rdx, 1" # one byte
+ asm "call write wrt ..plt"
+
+ asm "mov r12, rax"
+
+ return out
+;/
+
+/; print_alert
+ _printf(~_alert{0})
+;/
diff --git a/tnslc/utils/c_wrap_windows.tnsl b/tnslc/utils/c_wrap_windows.tnsl
new file mode 100644
index 0000000..577ca25
--- /dev/null
+++ b/tnslc/utils/c_wrap_windows.tnsl
@@ -0,0 +1,284 @@
+# Must be included at the top of the file
+asm "extern malloc"
+asm "extern realloc"
+asm "extern free"
+
+asm "extern printf"
+
+asm "extern CreateFileA"
+asm "extern ReadFile"
+asm "extern WriteFile"
+asm "extern CloseHandle"
+
+{}uint8 _alert = "Alert!\n\0"
+{}uint8 _dec = "%d\n\0"
+{}uint8 _ptr = "%p\n\0"
+
+/; _alloc (uint size) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 32"
+
+ # Mov size into proper register, and set all extras to zero
+ asm "mov rcx, r8"
+ asm "mov rdx, 0"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+
+ asm "call malloc"
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially, and we have a uint in r8)
+ asm "mov r9, rax"
+ return out
+;/
+
+/; _realloc (~void ptr, uint new_size) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 32"
+
+ # Mov ptr and new size into proper registers, and set all extras to zero
+ asm "mov rcx, r8"
+ asm "mov rdx, r9"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+ # Do call
+ asm "call realloc"
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9)
+ asm "mov r10, rax"
+ return out
+;/
+
+/; _delete (~void ptr)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "sub rsp, 32"
+
+ # setup call by clearing most values
+ asm "mov rcx, r8"
+ asm "mov rdx, 0"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+ # do call
+ asm "call free"
+ # there's no more to do 'cause free returns nothing
+;/
+
+/; _printf (~void str)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "push qword 0"
+ asm "push qword 0"
+ asm "push qword 0"
+ asm "push qword 0"
+
+ # setup call by clearing most values
+ asm "mov rcx, r8"
+ asm "mov rdx, 0"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+ # do call
+ asm "call printf"
+ # there's no more to do 'cause printf returns nothing
+;/
+
+/; _print_num (~void str, int num)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+ asm "push qword 0"
+ asm "push qword 0"
+ asm "push qword 0"
+ asm "push qword 0"
+
+ # setup call by clearing most values
+ asm "mov rcx, r8"
+ asm "mov rdx, r9"
+ asm "mov rdi, 0"
+ asm "mov rsi, 0"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+ # do call
+ asm "call printf"
+ # there's no more to do 'cause printf returns nothing
+;/
+
+
+# Create file for writing (overwrite)
+/; _create_file (~void name) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+
+ asm "mov rcx, r8" # lpFileName
+ asm "mov rdx, 1" # dwDesiredAccess
+ asm "shl rdx, 28" # (GENERIC_READ 1 << 31 | GENERIC_WRITE 1 << 30)
+ asm "mov r8, 3" # dwShareMode
+ asm "mov r9, 0" # lpSecurityAttributes
+
+ asm "push qword 0" # hTemplateFile
+ asm "push qword 128" # dwFlagsAndAttributes (NORMAL_FILE = 128)
+ asm "push qword 2" # dwCreationDisposition (CREATE_ALWAYS = 2)
+
+ # Shadow space
+ asm "push r9"
+ asm "push r8"
+ asm "push rdx"
+ asm "push rcx"
+
+ # Do call
+ asm "call CreateFileA"
+
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially. We have a ptr in r8)
+ asm "mov r9, rax"
+
+ return out
+;/
+
+# Open file for reading or writing (no overwrite)
+/; _open_file (~void name) [~void]
+ ~void out
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+
+ asm "mov rcx, r8" # lpFileName
+ asm "mov rdx, 1" # dwDesiredAccess
+ asm "shl rdx, 28" # (GENERIC_READ 1 << 31 | GENERIC_WRITE 1 << 30)
+ asm "mov r8, 3" # dwShareMode
+ asm "mov r9, 0" # lpSecurityAttributes
+
+ asm "push qword 0" # hTemplateFile
+ asm "push qword 128" # dwFlagsAndAttributes (NORMAL_FILE = 128)
+ asm "push qword 3" # dwCreationDisposition (OPEN_EXISTING = 3)
+
+ # Shadow space
+ asm "push r9"
+ asm "push r8"
+ asm "push rdx"
+ asm "push rcx"
+
+ # Do call
+ asm "call CreateFileA"
+
+ # Set out to the returned value
+ # (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9)
+ asm "mov r9, rax"
+
+ return out
+;/
+
+/; _close_file (~void handle)
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+
+ asm "mov rcx, r8" # handle
+ asm "mov rdx, 0"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+
+ # Shadow space
+ asm "push r9"
+ asm "push r8"
+ asm "push rdx"
+ asm "push rcx"
+
+ asm "call CloseHandle"
+
+ asm "add rsp, 32"
+;/
+
+/; _read_byte (~void handle, ~uint8 byte) [int]
+ ~int out
+ int i = 0
+ out = ~i
+
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+
+ asm "mov rcx, r8" # handle
+ asm "mov rdx, r9" # buffer
+ asm "mov r8, 1" # one byte
+ asm "mov r9, r10" # read bytes buffer
+ asm "push qword 0"
+
+ # Shadow space
+ asm "push r9"
+ asm "push r8"
+ asm "push rdx"
+ asm "push rcx"
+
+ asm "call ReadFile"
+
+ return out`
+;/
+
+/; _write_byte (~void handle, ~uint8 byte) [int]
+ ~int out
+ int i = 0
+ out = ~i
+
+ asm "mov rax, rsp"
+ asm "xor rdx, rdx"
+ asm "mov rcx, 32"
+ asm "div rcx"
+ asm "sub rsp, rdx"
+
+ asm "mov rcx, r8" # handle
+ asm "mov rdx, r9" # buffer
+ asm "mov r8, 1" # one byte
+ asm "mov r9, 0"
+ asm "push qword 0"
+
+ # Shadow space
+ asm "push r9"
+ asm "push r8"
+ asm "push rdx"
+ asm "push rcx"
+
+ asm "call WriteFile"
+
+ return out`
+;/
+
+/; print_alert
+ _printf(~_alert{0})
+;/
diff --git a/tnslc/utils/file.tnsl b/tnslc/utils/file.tnsl
index a33e30c..978f31b 100644
--- a/tnslc/utils/file.tnsl
+++ b/tnslc/utils/file.tnsl
@@ -5,7 +5,6 @@ struct File {
}
~uint8 PT_HANDLE = "Handle: %p\n\0"
-uint INVALID_HANDLE = 0xffffffff
~uint8 PARENT_DIR = ".."
~uint8 CURRENT_DIR = "."
@@ -43,7 +42,7 @@ uint INVALID_HANDLE = 0xffffffff
/; end
self.path.end()
- /; if (self.handle < INVALID_HANDLE && self.handle != NULL)
+ /; if (self.handle + 1 !== 0)
_close_file(self.handle)
self.handle = NULL
;/
@@ -52,17 +51,23 @@ uint INVALID_HANDLE = 0xffffffff
/; 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 !== INVALID_HANDLE && self.handle !== NULL)
+ /; if (self.handle + 1 !== 0)
_close_file(self.handle)
self.handle = NULL
self.at_end = false
@@ -86,4 +91,10 @@ uint INVALID_HANDLE = 0xffffffff
;/
;/
+ /; write_cstr (~uint8 str)
+ /; loop (self.at_end == false && str` !== 0) [str++]
+ self.write(str`)
+ ;/
+ ;/
+
;/
diff --git a/tnslc/utils/utils.tnsl b/tnslc/utils/utils.tnsl
index fece1da..eab2f8c 100644
--- a/tnslc/utils/utils.tnsl
+++ b/tnslc/utils/utils.tnsl
@@ -1,3 +1,5 @@
+:import "c_wrap_linux.tnsl"
+
/; module utils
:import "vector.tnsl"