about summary refs log tree commit diff stats
path: root/apps/parse-int.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-06-14 00:24:47 -0700
committerKartik Agaram <vc@akkartik.com>2020-06-14 00:28:23 -0700
commitad61776f498e8117756e4794eac840fab60cfac6 (patch)
tree73510284e749eab8c207aecef90084d0a5c57101 /apps/parse-int.mu
parentead3d08e774529f3026f8cd6f93b8a0d7c87ed08 (diff)
downloadmu-ad61776f498e8117756e4794eac840fab60cfac6.tar.gz
6520 - new app: parse-int
Several bugs fixed in the process, and expectation of further bugs is growing.
I'd somehow started assuming I don't need to have separate cases for rm32
as a register vs mem. That's not right. We might need more reg-reg Primitives.
Diffstat (limited to 'apps/parse-int.mu')
-rw-r--r--apps/parse-int.mu50
1 files changed, 50 insertions, 0 deletions
diff --git a/apps/parse-int.mu b/apps/parse-int.mu
new file mode 100644
index 00000000..c9c1d945
--- /dev/null
+++ b/apps/parse-int.mu
@@ -0,0 +1,50 @@
+# parse a decimal int at the commandline
+#
+# To run:
+#   $ ./translate_mu apps/parse-int.mu
+#   $ ./a.elf 123
+#   $ echo $?
+#   123
+
+fn main _args: (addr array (addr array byte)) -> exit-status/ebx: int {
+$main-body: {
+  # if no args, print a message and exit
+  var args/esi: (addr array (addr array byte)) <- copy _args
+  var n/ecx: int <- length args
+  compare n, 1
+  {
+    break-if->
+    print-string "usage: parse-int <integer>\n"
+    exit-status <- copy 1
+    break $main-body
+  }
+  # otherwise parse the first arg as an integer
+  var in/ecx: (addr addr array byte) <- index args, 1
+  var out/eax: int <- parse-int *in
+  exit-status <- copy out
+}
+}
+
+fn parse-int _in: (addr array byte) -> result/eax: int {
+  var in/esi: (addr array byte) <- copy _in
+  var len/edx: int <- length in
+  var i/ecx: int <- copy 0
+  var out/edi: int <- copy 0
+  {
+    compare i, len
+    break-if->=
+    # out *= 10
+    var ten/eax: int <- copy 0xa
+    out <- multiply ten
+    # c = in[i]
+    var tmp/ebx: (addr byte) <- index in, i
+    var c/eax: byte <- copy 0
+    c <- copy-byte *tmp
+    #
+    var digit/eax: int <- to-decimal-digit c
+    out <- add digit
+    i <- increment
+    loop
+  }
+  result <- copy out
+}