summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tnslc/tnslc.tnsl17
-rw-r--r--tnslc/vector.tnsl34
2 files changed, 51 insertions, 0 deletions
diff --git a/tnslc/tnslc.tnsl b/tnslc/tnslc.tnsl
index 56623b7..f9b26c7 100644
--- a/tnslc/tnslc.tnsl
+++ b/tnslc/tnslc.tnsl
@@ -11,6 +11,23 @@
utils.Vector vec
vec.init(1)
+
+ vec.push_char('h')
+ vec.push_char('e')
+ vec.push_char('l')
+ vec.push_char('l')
+ vec.push_char('o')
+ vec.push_char(' ')
+ vec.push_char('w')
+ vec.push_char('o')
+ vec.push_char('r')
+ vec.push_char('l')
+ vec.push_char('d')
+ vec.push_char('\n')
+ vec.push_char(0)
+
+ _printf(vec.data)
+
vec.end()
return 0
diff --git a/tnslc/vector.tnsl b/tnslc/vector.tnsl
index 529e3a2..2175877 100644
--- a/tnslc/vector.tnsl
+++ b/tnslc/vector.tnsl
@@ -7,6 +7,7 @@ struct Vector {
}
uint VECTOR_MIN_ELEMENTS = 4
+uint VECTOR_MAX_GROW = 256
~void NULL = 0
~uint8 NUM_STR = "Num %d\n\0"
@@ -20,6 +21,11 @@ uint VECTOR_MIN_ELEMENTS = 4
self.data = _alloc(self.size * self._elsz)
;/
+ /; _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
@@ -28,6 +34,34 @@ uint VECTOR_MIN_ELEMENTS = 4
return self.data + index * self._elsz
;/
+ /; push (~void el)
+ /; if (self.size == self.count)
+ /; 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++]
+ ~void to = start + i
+ ~void from = el + i
+ to` = from`
+ ;/
+ self.count++
+ ;/
+
+ /; push_char (uint8 ch)
+ self.push(~ch)
+ ;/
+
+ /; push_cstr(~uint8 ch)
+ /; loop (ch` != 0) [ch++]
+ self.push(ch)
+ ;/
+ ;/
+
/; end
self.count = 0
self.size = 0