summaryrefslogtreecommitdiff
path: root/tnslc/utils
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc/utils')
-rw-r--r--tnslc/utils/algo.tnsl10
-rw-r--r--tnslc/utils/file.tnsl89
-rw-r--r--tnslc/utils/utils.tnsl6
-rw-r--r--tnslc/utils/vector.tnsl201
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)
+ ;/
+;/
+