From 9e29dd5678d463426d224ad50014a37b04ff34cc Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Mon, 4 Oct 2021 23:47:22 +0200 Subject: Implemented Funge-98 IO procedures --- src/defaultIO.nim | 40 ++++++++++++++++++++++++++++++++++++++++ tests/defaultIO.nim | 25 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/defaultIO.nim create mode 100644 tests/defaultIO.nim 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}") diff --git a/tests/defaultIO.nim b/tests/defaultIO.nim new file mode 100644 index 0000000..2de2330 --- /dev/null +++ b/tests/defaultIO.nim @@ -0,0 +1,25 @@ +discard """ + input: "ab1234cd12f" + output: ''' +[Suite] defaultIO +gh789 + ''' +""" + +import unittest + +include ../src/defaultIO + +suite "defaultIO": + test "defaultCharacterInput": + check defaultCharacterInput() == 'a'.int + check defaultCharacterInput() == 'b'.int + check defaultCharacterInput() == '1'.int + test "defaultDecimalInput": + check defaultDecimalInput() == 234 + check defaultCharacterInput() == 'c'.int + test "defaultCharacterOutput": + defaultCharacterOutput('g'.int) + defaultCharacterOutput('h'.int) + test "defaultDecimalOutput": + defaultDecimalOutput(789) -- cgit v1.2.3