diff options
Diffstat (limited to '')
-rw-r--r-- | src/defaultIO.nim | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/defaultIO.nim b/src/defaultIO.nim new file mode 100644 index 0000000..52bcb83 --- /dev/null +++ b/src/defaultIO.nim @@ -0,0 +1,40 @@ +import strformat + +## We keep the last input char to handle a pain point in the funge-98 spec : +## when reading from the decimal input you need to read until you encounter a +## non numeric char, but not drop it +var defaultInputLastChar: ref int + +var stdIoUnbuffered = false + +proc defaultCharacterInput*(): int = + if defaultInputLastChar != nil: + result = defaultInputLastChar[] + defaultInputLastChar = nil + return result + if not stdIoUnbuffered: + setStdIoUnbuffered() + stdIoUnbuffered = true + return stdin.readChar().int() + +proc defaultDecimalInput*(): int = + while true: # First we need to find the next numeric char + let c = defaultCharacterInput() + if c >= int('0') and c <= int('9'): + result = c - int('0') + break + while true: # then we read until we encounter a non numeric char + let c = defaultCharacterInput() + if c >= int('0') and c <= int('9'): + result = result * 10 + c - int('0') + else: + new(defaultInputLastChar) + defaultInputLastChar[] = c + break + return result + +proc defaultCharacterOutput*(v: int) = + discard stdout.writeChars(@[v.char()], 0, 1) + +proc defaultDecimalOutput*(v: int) = + stdout.write(&"{v}") |