diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-09-26 21:23:04 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-09-26 21:26:20 -0700 |
commit | 5babe16f2d4a8e51f6ffc8acd02bafe47d510ad0 (patch) | |
tree | 729cd28a695dd2ce52547c879a8570bfe8138ff9 /apps/tile/table.mu | |
parent | e46cfc2e0c053c3dc2ca17e52126a97f29ce618b (diff) | |
download | mu-5babe16f2d4a8e51f6ffc8acd02bafe47d510ad0.tar.gz |
6868
First function call working in apps/tile!
Diffstat (limited to 'apps/tile/table.mu')
-rw-r--r-- | apps/tile/table.mu | 39 |
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 + } +} |