diff options
author | Kyle Gunger <kgunger12@gmail.com> | 2023-05-20 23:53:12 -0400 |
---|---|---|
committer | Kyle Gunger <kgunger12@gmail.com> | 2023-05-20 23:53:12 -0400 |
commit | bee7954037af2025fdeae9a75f0c113cd39024cb (patch) | |
tree | 775fc528161f507cf6aab4fddaa4f1ef922860c9 /tnslc/tnslc_wrapped.tnsl | |
parent | ba0ffe00d0c62c8ac8e0f98596193b69975c9fe9 (diff) |
File copy example
Diffstat (limited to 'tnslc/tnslc_wrapped.tnsl')
-rw-r--r-- | tnslc/tnslc_wrapped.tnsl | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tnslc/tnslc_wrapped.tnsl b/tnslc/tnslc_wrapped.tnsl new file mode 100644 index 0000000..77d7c13 --- /dev/null +++ b/tnslc/tnslc_wrapped.tnsl @@ -0,0 +1,90 @@ +:include "c_wrap.tnsl" +:include "vector.tnsl" +:include "utils.tnsl" + +enum TOKEN_TYPE [int] { + DEFWORD = 0 +} + +struct Token { + int line, ch, _type, + ~uint8 data +} + +/; method Token + /; init + self.data = _alloc(1) + self.data{0} = 0 + ;/ + + /; data_len [int] + return cstr_len(self.data) + ;/ + + /; append (uint8 ch) + int l = self.data_len() + self.data = _realloc(self.data, self.data_len() + 1) + self.data{l + 1} = 0 + self.data{l} = ch + ;/ + + /; pop + int l = self.data_len() + self.data = _realloc(self.data, l - 1) + self.data{l - 1} = 0 + ;/ + + /; clear + _delete(self.data) + ;/ + + /; eq (~Token t) [bool] + return cstr_eq(self.data, t`.data) + ;/ +;/ + +/; tokenize (~void file) [Vector] + Vector out + out.start(32) + + + + return out +;/ + +{}uint8 wrong_args = "Usage: copy [from] [to]" +{}uint8 write_one = "\0\n\0" + +# Proof of concept copy program +/; main (int argc, ~~uint8 argv) [int] + asm "mov r8, rcx" + asm "mov r9, rdx" + + /; if (argc < 3) + _printf(~wrong_args{0}) + return 1 + ;/ + + ~void read_handle = _open_file(argv{1}) + ~void write_handle = _create_file(argv{2}) + + _print_num(~_dec{0}, read_handle) + _print_num(~_dec{0}, write_handle) + + uint8 buf = 0 + int read_count = 0 + int tries = 0 + _read_byte(read_handle, ~buf, ~read_count) + /; loop (_read_byte(read_handle, ~buf, ~read_count)) + /; if (read_count == 0) + break + ;/ + _write_byte(write_handle, ~buf) + read_count = 0 + ;/ + + _close_file(read_handle) + _close_file(write_handle) + + return 0 +;/
\ No newline at end of file |