about summary refs log tree commit diff stats
path: root/apps/arith.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-06-15 19:37:07 -0700
committerKartik Agaram <vc@akkartik.com>2020-06-15 19:37:07 -0700
commit705dfd8587fab7d850163a3bbbca5075724ad946 (patch)
treeef621a451c499e5fe33c7b5ad5f278db56c0ee78 /apps/arith.mu
parent2041ce7e59ccecaeb765fde97d9b6463fa7857cb (diff)
downloadmu-705dfd8587fab7d850163a3bbbca5075724ad946.tar.gz
6534 - arith: add/subtract
Diffstat (limited to 'apps/arith.mu')
-rw-r--r--apps/arith.mu40
1 files changed, 37 insertions, 3 deletions
diff --git a/apps/arith.mu b/apps/arith.mu
index 09e464cd..2f41c5cd 100644
--- a/apps/arith.mu
+++ b/apps/arith.mu
@@ -20,19 +20,53 @@ fn main -> exit-status/ebx: int {
 }
 
 fn simplify -> result/eax: int, look/esi: byte {
+$simplify:body: {
   look <- get-char  # prime the pump
   # first arg
   look <- skip-spaces look
   {
-    var is-digit?/eax: boolean <- is-decimal-digit? look
-    compare is-digit?, 0  # false
-    break-if-=
+    {
+      var is-digit?/eax: boolean <- is-decimal-digit? look
+      compare is-digit?, 0  # false
+      break-if-= $simplify:body
+    }
     result, look <- num look
   }
+  # operator
+  var op/ecx: byte <- copy 0
+  look <- skip-spaces look
+  op, look <- operator look
+  # second arg
+  var second/edx: int <- copy 0
+  look <- skip-spaces look
+  {
+    var tmp/eax: int <- copy 0
+    tmp, look <- num look
+    second <- copy tmp
+  }
+  # perform op
+  {
+    compare op, 0x2b  # '+'
+    break-if-!=
+    result <- add second
+    break $simplify:body
+  }
+  {
+    compare op, 0x2d  # '-'
+    break-if-!=
+    result <- subtract second
+    break $simplify:body
+  }
+}  # $simplify:body
   # trailing spaces
   look <- skip-spaces look
 }
 
+fn operator _look: byte -> op/ecx: byte, look/esi: byte {
+  op <- copy _look
+  look <- get-char
+}
+
 fn num _look: byte -> result/eax: int, look/esi: byte {
   look <- copy _look  # should be a no-op; guaranteed to be a digit
   var out/edi: int <- copy 0