diff options
Diffstat (limited to 'tests/std/io.toc')
-rw-r--r-- | tests/std/io.toc | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/std/io.toc b/tests/std/io.toc new file mode 100644 index 0000000..9fa7e08 --- /dev/null +++ b/tests/std/io.toc @@ -0,0 +1,53 @@ +/* @TODO: use write / WriteFile */ + +#include "std/base.toc", base; + +putchar ::= #foreign("putchar", base.libc) fn(#C int) #C int; +toc_putchar ::= fn(x: char) { + putchar(x as #C int); +} + +/* +unfortunately, we can't use fwrite because MSVC doesn't like it when you +use a file handle that's not from the DLL. (i.e. you can't pass your stdout +to the imported version of fwrite) +*/ + +writes ::= fn(x: []char) { + for c := x { + toc_putchar(c); + } +} + +puts ::= fn(x: []char) { + writes(x); + toc_putchar('\n'); +} + +writei ::= fn(x: int) { + if x < 0 { + toc_putchar('-'); + // NOTE: don't do x = -x; here to make sure I64_MIN works + } + if x == 0 { + toc_putchar('0'); + } else { + abs ::= fn(x: int) int { if x < 0 { -x } else { x } }; + scan_digit := 1000000000000000000; + started := false; + while scan_digit > 0 { + digit := abs((x / scan_digit) % 10); + if digit > 0 { started = true; } + if started { + toc_putchar((('0' as int) + digit) as char); + } + scan_digit /= 10; + } + } +} + +puti ::= fn(x: int) { + writei(x); + toc_putchar('\n'); +} + |