about summary refs log tree commit diff stats
path: root/linux/apps/parse-int.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-07-16 08:09:42 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-07-16 08:28:56 -0700
commit44d26b77c45668c9b0c99894a4294cec004361fe (patch)
tree68a5dcd4971873efd4ce184e9bf9a531c2161813 /linux/apps/parse-int.mu
parentac45f097153afd3a89f43886e4124c5b2c26b98a (diff)
downloadmu-44d26b77c45668c9b0c99894a4294cec004361fe.tar.gz
.
Diffstat (limited to 'linux/apps/parse-int.mu')
-rw-r--r--linux/apps/parse-int.mu47
1 files changed, 47 insertions, 0 deletions
diff --git a/linux/apps/parse-int.mu b/linux/apps/parse-int.mu
new file mode 100644
index 00000000..0f8c71d1
--- /dev/null
+++ b/linux/apps/parse-int.mu
@@ -0,0 +1,47 @@
+# parse a decimal int at the commandline
+#
+# To run:
+#   $ ./translate apps/parse-int.mu
+#   $ ./a.elf 123
+#   $ echo $?
+#   123
+
+fn main _args: (addr array addr array byte) -> _/ebx: int {
+  # 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 0/screen, "usage: parse-int <integer>\n"
+    return 1
+  }
+  # 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
+  return out
+}
+
+fn parse-int _in: (addr array byte) -> _/eax: int {
+  var in/esi: (addr array byte) <- copy _in
+  var len/edx: int <- length in
+  var i/ecx: int <- copy 0
+  var result/edi: int <- copy 0
+  {
+    compare i, len
+    break-if->=
+    # result *= 10
+    var ten/eax: int <- copy 0xa
+    result <- multiply ten
+    # c = in[i]
+    var tmp/ebx: (addr byte) <- index in, i
+    var c/eax: byte <- copy-byte *tmp
+    #
+    var g/eax: grapheme <- copy c
+    var digit/eax: int <- to-decimal-digit g
+    result <- add digit
+    i <- increment
+    loop
+  }
+  return result
+}