2020-06-14 07:24:47 +00:00
|
|
|
# parse a decimal int at the commandline
|
|
|
|
#
|
|
|
|
# To run:
|
2021-07-16 15:09:42 +00:00
|
|
|
# $ ./translate apps/parse-int.mu
|
2020-06-14 07:24:47 +00:00
|
|
|
# $ ./a.elf 123
|
|
|
|
# $ echo $?
|
|
|
|
# 123
|
|
|
|
|
2020-11-02 06:17:40 +00:00
|
|
|
fn main _args: (addr array addr array byte) -> _/ebx: int {
|
2020-06-14 07:24:47 +00:00
|
|
|
# if no args, print a message and exit
|
2020-08-22 17:10:54 +00:00
|
|
|
var args/esi: (addr array addr array byte) <- copy _args
|
2020-06-14 07:24:47 +00:00
|
|
|
var n/ecx: int <- length args
|
|
|
|
compare n, 1
|
|
|
|
{
|
|
|
|
break-if->
|
2021-02-07 08:17:17 +00:00
|
|
|
print-string 0/screen, "usage: parse-int <integer>\n"
|
2020-11-02 06:17:40 +00:00
|
|
|
return 1
|
2020-06-14 07:24:47 +00:00
|
|
|
}
|
|
|
|
# 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
|
2020-11-02 06:17:40 +00:00
|
|
|
return out
|
2020-06-14 07:24:47 +00:00
|
|
|
}
|
|
|
|
|
2020-11-02 06:17:40 +00:00
|
|
|
fn parse-int _in: (addr array byte) -> _/eax: int {
|
2020-06-14 07:24:47 +00:00
|
|
|
var in/esi: (addr array byte) <- copy _in
|
|
|
|
var len/edx: int <- length in
|
|
|
|
var i/ecx: int <- copy 0
|
2020-11-02 06:17:40 +00:00
|
|
|
var result/edi: int <- copy 0
|
2020-06-14 07:24:47 +00:00
|
|
|
{
|
|
|
|
compare i, len
|
|
|
|
break-if->=
|
2020-11-02 06:17:40 +00:00
|
|
|
# result *= 10
|
2020-06-14 07:24:47 +00:00
|
|
|
var ten/eax: int <- copy 0xa
|
2020-11-02 06:17:40 +00:00
|
|
|
result <- multiply ten
|
2020-06-14 07:24:47 +00:00
|
|
|
# c = in[i]
|
|
|
|
var tmp/ebx: (addr byte) <- index in, i
|
2020-11-02 06:17:40 +00:00
|
|
|
var c/eax: byte <- copy-byte *tmp
|
2020-06-14 07:24:47 +00:00
|
|
|
#
|
2020-11-02 06:17:40 +00:00
|
|
|
var g/eax: grapheme <- copy c
|
|
|
|
var digit/eax: int <- to-decimal-digit g
|
|
|
|
result <- add digit
|
2020-06-14 07:24:47 +00:00
|
|
|
i <- increment
|
|
|
|
loop
|
|
|
|
}
|
2020-11-02 06:17:40 +00:00
|
|
|
return result
|
2020-06-14 07:24:47 +00:00
|
|
|
}
|