diff --git a/std/std.porth b/std/std.porth index 41b24325..da087e9e 100644 --- a/std/std.porth +++ b/std/std.porth @@ -396,3 +396,69 @@ end macro eputs stderr fputs end + +macro _put_digit + "0123456789" swap drop + 1 swap puts +end + +macro _putd_before + dup 10 % + over 10 / +end +macro _putd_after + drop + _put_digit +end + +macro putd + if dup 0 = do + "0" puts + else + if dup 0 < do + "-" puts + -1 * + end + + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + if dup 0 > do _putd_before + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + _putd_after end + end drop +end + diff --git a/tests/putd.porth b/tests/putd.porth new file mode 100644 index 00000000..076e99b6 --- /dev/null +++ b/tests/putd.porth @@ -0,0 +1,14 @@ +include "std.porth" + +//Zero +0 putd +"\n" puts + +//max i64 +9223372036854775807 putd +"\n" puts + +//negative +0 5 - putd +"\n" puts + diff --git a/tests/putd.txt b/tests/putd.txt new file mode 100644 index 00000000..cd674e97 --- /dev/null +++ b/tests/putd.txt @@ -0,0 +1,11 @@ +:i argc 0 +:b stdin 0 + +:i returncode 0 +:b stdout 25 +0 +9223372036854775807 +-5 + +:b stderr 0 +