Fixed standard input error handling
This commit is contained in:
parent
18b1117749
commit
2dbd22114b
3 changed files with 25 additions and 12 deletions
|
@ -177,9 +177,17 @@ func (p *Pointer) eval(c int, f *field.Field) (done bool, returnValue *int) {
|
||||||
case ',':
|
case ',':
|
||||||
p.CharacterOutput(p.ss.head.Pop())
|
p.CharacterOutput(p.ss.head.Pop())
|
||||||
case '&':
|
case '&':
|
||||||
p.ss.head.Push(p.DecimalInput())
|
if v, err := p.DecimalInput(); err != nil {
|
||||||
|
p.Reverse()
|
||||||
|
} else {
|
||||||
|
p.ss.head.Push(v)
|
||||||
|
}
|
||||||
case '~':
|
case '~':
|
||||||
p.ss.head.Push(p.CharacterInput())
|
if v, err := p.CharacterInput(); err != nil {
|
||||||
|
p.Reverse()
|
||||||
|
} else {
|
||||||
|
p.ss.head.Push(v)
|
||||||
|
}
|
||||||
case 'y':
|
case 'y':
|
||||||
n := p.ss.head.Pop()
|
n := p.ss.head.Pop()
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
|
@ -2,37 +2,42 @@ package pointer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultInputLastChar *int = nil
|
var defaultInputLastChar *int = nil
|
||||||
|
|
||||||
func DefaultCharacterInput() int {
|
func DefaultCharacterInput() (int, error) {
|
||||||
if defaultInputLastChar != nil {
|
if defaultInputLastChar != nil {
|
||||||
c := *defaultInputLastChar
|
c := *defaultInputLastChar
|
||||||
defaultInputLastChar = nil
|
defaultInputLastChar = nil
|
||||||
return c
|
return c, nil
|
||||||
}
|
}
|
||||||
b := make([]byte, 1)
|
b := make([]byte, 1)
|
||||||
i, err := os.Stdin.Read(b)
|
i, err := os.Stdin.Read(b)
|
||||||
if err != nil {
|
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
|
var v int
|
||||||
for {
|
for {
|
||||||
c := DefaultCharacterInput()
|
c, err := DefaultCharacterInput()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
if c >= '0' && c <= '9' {
|
if c >= '0' && c <= '9' {
|
||||||
v = c - '0'
|
v = c - '0'
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
c := DefaultCharacterInput()
|
c, err := DefaultCharacterInput()
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
if c >= '0' && c <= '9' {
|
if c >= '0' && c <= '9' {
|
||||||
v = v*10 + c - '0'
|
v = v*10 + c - '0'
|
||||||
} else {
|
} else {
|
||||||
|
@ -40,7 +45,7 @@ func DefaultDecimalInput() int {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return v
|
return v, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DefaultCharacterOutput(c int) {
|
func DefaultCharacterOutput(c int) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
var myRand = rand.New(rand.NewSource(time.Now().UnixNano()))
|
var myRand = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
|
||||||
type InputFunction func() int
|
type InputFunction func() (int, error)
|
||||||
type OutputFunction func(v int)
|
type OutputFunction func(v int)
|
||||||
|
|
||||||
type Pointer struct {
|
type Pointer struct {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue