diff options
author | Kyle Gunger <kgunger12@gmail.com> | 2024-03-29 16:55:01 -0400 |
---|---|---|
committer | Kyle Gunger <kgunger12@gmail.com> | 2024-03-29 16:55:01 -0400 |
commit | 606ab9da9e4231564c91e4613bfbbb8883f7eb9d (patch) | |
tree | 2be0ef587d12aa11f863b4e48c388d988a665a9f /tnslc/utils | |
parent | c4638488d9a73df832542e40204f56c7d7d179e2 (diff) |
File read test
Diffstat (limited to 'tnslc/utils')
-rw-r--r-- | tnslc/utils/algo.tnsl | 10 | ||||
-rw-r--r-- | tnslc/utils/file.tnsl | 89 | ||||
-rw-r--r-- | tnslc/utils/utils.tnsl | 6 | ||||
-rw-r--r-- | tnslc/utils/vector.tnsl | 201 |
4 files changed, 306 insertions, 0 deletions
diff --git a/tnslc/utils/algo.tnsl b/tnslc/utils/algo.tnsl new file mode 100644 index 0000000..c501e35 --- /dev/null +++ b/tnslc/utils/algo.tnsl @@ -0,0 +1,10 @@ + +/; strcmp(~uint8 a, b) [bool] + /; loop (a` == b` && a` !== 0 && b` !== 0) [a++; b++] ;/ + + /; if (b` == 0 && a` == 0) + return true + ;/ + return false +;/ + diff --git a/tnslc/utils/file.tnsl b/tnslc/utils/file.tnsl new file mode 100644 index 0000000..a33e30c --- /dev/null +++ b/tnslc/utils/file.tnsl @@ -0,0 +1,89 @@ +struct File { + Artifact path, + ~void handle, + bool at_end +} + +~uint8 PT_HANDLE = "Handle: %p\n\0" +uint INVALID_HANDLE = 0xffffffff +~uint8 PARENT_DIR = ".." +~uint8 CURRENT_DIR = "." + +/; method File + /; init (~uint8 str) + self.path.init() + self.path.split_cstr(str, '/') + self.handle = NULL + self.at_end = false + ;/ + + /; relative (~uint8 path) [File] + ~uint8 current = self.path.to_cstr('/') + File out + out.init(current) + _delete(current) + out.path.pop() + + Artifact add + add.init() + add.split_cstr(path, '/') + + # Brunt of work here + /; loop (uint i = 0; i < add.count) [i++] + ~uint8 cur = add.get(i) + /; if (strcmp(cur, CURRENT_DIR) == false) + out.path.split_cstr(cur, '/') + ;/ + ;/ + + add.end() + + return out + ;/ + + /; end + self.path.end() + /; if (self.handle < INVALID_HANDLE && self.handle != NULL) + _close_file(self.handle) + self.handle = NULL + ;/ + ;/ + + /; open + ~uint8 p = self.path.to_cstr('/') + self.handle = _open_file(p) + _delete(p) + ;/ + + /; create + ~uint8 p = self.path.to_cstr('/') + self.handle = _create_file(p) + _delete(p) + ;/ + + /; close + /; if (self.handle !== INVALID_HANDLE && self.handle !== NULL) + _close_file(self.handle) + self.handle = NULL + self.at_end = false + ;/ + ;/ + + /; read [uint8] + uint8 out + int bytes = _read_byte(self.handle, ~out) + /; if (bytes == 0) + self.at_end = true + return 0 + ;/ + return out + ;/ + + /; write (uint8 byte) + int written = _write_byte(self.handle, ~byte) + /; if (written == 0) + self.at_end = true + ;/ + ;/ + +;/ diff --git a/tnslc/utils/utils.tnsl b/tnslc/utils/utils.tnsl new file mode 100644 index 0000000..aa7968a --- /dev/null +++ b/tnslc/utils/utils.tnsl @@ -0,0 +1,6 @@ +/; module utils + + :import "vector.tnsl" + :import "file.tnsl" + :import "algo.tnsl" +;/ diff --git a/tnslc/utils/vector.tnsl b/tnslc/utils/vector.tnsl new file mode 100644 index 0000000..d00d698 --- /dev/null +++ b/tnslc/utils/vector.tnsl @@ -0,0 +1,201 @@ +struct Vector { + ~void data, + uint + count, + size, + _elsz +} + +uint VECTOR_MIN_ELEMENTS = 4 +uint VECTOR_MAX_GROW = 256 + +~uint8 NUM_STR = "Num %d\n\0" + +/; method Vector + + /; init (uint elsz) + self._elsz = elsz + self.size = VECTOR_MIN_ELEMENTS + self.count = 0 + self.data = _alloc(self.size * self._elsz) + ;/ + + /; from_cstr(~uint8 cstr) + self.init(1) + self.push_cstr(cstr) + ;/ + + /; _grow (uint i) + self.size = self.size + i + self.data = _realloc(self.data, self.size * self._elsz) + ;/ + + /; get (uint index) [~void] + /; if (index !< self.count) + return NULL + ;/ + + return self.data + index * self._elsz + ;/ + + /; push (~void el) + /; if (self.size == self.count + 1) + /; if (self.size < VECTOR_MAX_GROW) + self._grow(self.size) + ;; else + self._grow(VECTOR_MAX_GROW) + ;/ + ;/ + + ~void start = self.data + self.count * self._elsz + /; loop (int i = 0; i < self._elsz) [i++] + ~uint8 to = start + i + ~uint8 from = el + i + to` = from` + ;/ + self.count++ + ;/ + + /; _shrink(uint i) + /; if (i !< self.size) + self.size = 1 + ;; else + self.size = self.size - i + ;/ + + self.data = _realloc(self.data, self.size * self._elsz) + ;/ + + /; pop + self.count-- + + /; if (self.count < self.size / 2) + self._shrink(self.size / 3) + ;/ + ;/ + + /; push_char (uint8 ch) + self.push(~ch) + ;/ + + /; push_cstr(~uint8 ch) + /; loop (ch` !== 0) [ch++] + self.push(ch) + ;/ + ;/ + + /; as_cstr [~uint8] + ~uint8 z = self.data + self.count + z` = 0 + return self.data + ;/ + + /; end + self.count = 0 + self.size = 0 + self._elsz = 0 + _delete(self.data) + ;/ +;/ + + +# Artifacts + +struct Artifact { + ~~uint8 strings, + uint + size, + count +} + +/; method Artifact + + /; init + self.size = VECTOR_MIN_ELEMENTS + self.count = 0 + self.strings = _alloc(len self.strings * self.size) + ;/ + + /; split_cstr (~uint8 str, uint8 split) + Vector track + track.init(1) + + /; loop (str` !== 0) [str++] + /; if (str` == split) + self.push(track.as_cstr()) + track.init(1) + ;; else + track.push(str) + ;/ + ;/ + + self.push(track.as_cstr()) + ;/ + + /; _grow (uint i) + self.size = self.size + i + self.strings = _realloc(self.strings, self.size * len self.strings) + ;/ + + /; push (~uint8 str) + /; if (self.size == self.count + 1) + /; if (self.size < VECTOR_MAX_GROW) + self._grow(self.size) + ;; else + self._grow(VECTOR_MAX_GROW) + ;/ + ;/ + + self.strings{self.count} = str + self.count++ + ;/ + + /; _shrink(uint i) + /; if (i !< self.size) + self.size = 1 + ;; else + self.size = self.size - i + ;/ + + self.strings = _realloc(self.strings, self.size * len self.strings) + ;/ + + /; pop + _delete(self.get(self.count - 1)) + self.count-- + + /; if (self.count < self.size / 2) + self._shrink(self.size / 3) + ;/ + ;/ + + /; get (uint index) [~uint8] + /; if (index !< self.count) + return NULL + ;/ + + return self.strings{index} + ;/ + + /; to_cstr (uint8 join) [~uint8] + Vector out + out.init(1) + + /; loop (int i = 0; i < self.count) [i++] + out.push_cstr(self.get(i)) + /; if (i < self.count - 1) + out.push(~join) + ;/ + ;/ + + return out.as_cstr() + ;/ + + /; end + /; loop (int i = 0; i < self.count) [i++] + _delete(self.get(i)) + ;/ + _delete(self.strings) + ;/ +;/ + |