Fixed standard input error handling

This commit is contained in:
Julien Dessaux 2021-12-04 00:07:41 +01:00
parent 18b1117749
commit 2dbd22114b
3 changed files with 25 additions and 12 deletions

View file

@ -177,9 +177,17 @@ func (p *Pointer) eval(c int, f *field.Field) (done bool, returnValue *int) {
case ',':
p.CharacterOutput(p.ss.head.Pop())
case '&':
p.ss.head.Push(p.DecimalInput())
if v, err := p.DecimalInput(); err != nil {
p.Reverse()
} else {
p.ss.head.Push(v)
}
case '~':
p.ss.head.Push(p.CharacterInput())
if v, err := p.CharacterInput(); err != nil {
p.Reverse()
} else {
p.ss.head.Push(v)
}
case 'y':
n := p.ss.head.Pop()
now := time.Now()

View file

@ -2,37 +2,42 @@ package pointer
import (
"fmt"
"log"
"os"
)
var defaultInputLastChar *int = nil
func DefaultCharacterInput() int {
func DefaultCharacterInput() (int, error) {
if defaultInputLastChar != nil {
c := *defaultInputLastChar
defaultInputLastChar = nil
return c
return c, nil
}
b := make([]byte, 1)
i, err := os.Stdin.Read(b)
if err != nil {
log.Fatalf("Error in DefaultCharacterInput { b: %c, i: %d, err: %+v }", b[0], i, err)
return 0, fmt.Errorf("Error in DefaultCharacterInput { b: %c, i: %d, err: %w }", b[0], i, err)
}
return int(b[0])
return int(b[0]), nil
}
func DefaultDecimalInput() int {
func DefaultDecimalInput() (int, error) {
var v int
for {
c := DefaultCharacterInput()
c, err := DefaultCharacterInput()
if err != nil {
return 0, err
}
if c >= '0' && c <= '9' {
v = c - '0'
break
}
}
for {
c := DefaultCharacterInput()
c, err := DefaultCharacterInput()
if err != nil {
break
}
if c >= '0' && c <= '9' {
v = v*10 + c - '0'
} else {
@ -40,7 +45,7 @@ func DefaultDecimalInput() int {
break
}
}
return v
return v, nil
}
func DefaultCharacterOutput(c int) {

View file

@ -9,7 +9,7 @@ import (
var myRand = rand.New(rand.NewSource(time.Now().UnixNano()))
type InputFunction func() int
type InputFunction func() (int, error)
type OutputFunction func(v int)
type Pointer struct {