about summary refs log tree commit diff stats
path: root/apps/tile/table.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-09-26 21:23:04 -0700
committerKartik Agaram <vc@akkartik.com>2020-09-26 21:26:20 -0700
commit5babe16f2d4a8e51f6ffc8acd02bafe47d510ad0 (patch)
tree729cd28a695dd2ce52547c879a8570bfe8138ff9 /apps/tile/table.mu
parente46cfc2e0c053c3dc2ca17e52126a97f29ce618b (diff)
downloadmu-5babe16f2d4a8e51f6ffc8acd02bafe47d510ad0.tar.gz
6868
First function call working in apps/tile!
Diffstat (limited to 'apps/tile/table.mu')
-rw-r--r--apps/tile/table.mu39
1 files changed, 37 insertions, 2 deletions
diff --git a/apps/tile/table.mu b/apps/tile/table.mu
index 851f891c..53fb5ce7 100644
--- a/apps/tile/table.mu
+++ b/apps/tile/table.mu
@@ -1,7 +1,7 @@
-fn initialize-table _self: (addr table) {
+fn initialize-table _self: (addr table), n: int {
   var self/esi: (addr table) <- copy _self
   var data-ah/eax: (addr handle array bind) <- get self, data
-  populate data-ah, 0x10
+  populate data-ah, n
 }
 
 fn bind-int-in-table _self: (addr table), key: (addr handle array byte), val: int {
@@ -45,3 +45,38 @@ fn make-binding _self: (addr bind), key: (addr handle array byte), _val: int {
   var val/ecx: int <- copy _val
   copy-to *dest3, val
 }
+
+# TODO: supporting non-integers
+# That'll require radical surgery.
+fn lookup-binding _self: (addr table), key: (addr array byte) -> result/eax: int, found?/ecx: boolean {
+  var self/esi: (addr table) <- copy _self
+  var data-ah/esi: (addr handle array bind) <- get self, data
+  var _data/eax: (addr array bind) <- lookup *data-ah
+  var data/esi: (addr array bind) <- copy _data
+  var len/edx: int <- length data
+  var i/ebx: int <- copy 0
+  found? <- copy 0  # false
+  $lookup-binding:loop: {
+    compare i, len
+    break-if->=
+    {
+      var offset/edx: (offset bind) <- compute-offset data, i
+      var target-bind/esi: (addr bind) <- index data, offset
+      var target2/edx: (addr handle array byte) <- get target-bind, key
+      var target3/eax: (addr array byte) <- lookup *target2
+      compare target3, 0
+      break-if-= $lookup-binding:loop
+      var is-match?/eax: boolean <- string-equal? target3, key
+      compare is-match?, 0  # false
+      break-if-=
+      # found
+      found? <- copy 1  # true
+      var dest2/eax: (addr value) <- get target-bind, value
+      var dest3/eax: (addr int) <- get dest2, scalar-data
+      result <- copy *dest3
+      break $lookup-binding:loop
+    }
+    i <- increment
+    loop
+  }
+}