commit f5c1fb462a5163db0e9240fa5cad6a67bd4b2a61
parent 61f8144755065e465703f2381b0c07e632dda094
Author: david cochran <about.trout@gmail.com>
Date: Sat, 30 Dec 2023 05:30:59 -0800
fixes #8 - let REPL handle interpreter Reset
Diffstat:
2 files changed, 12 insertions(+), 25 deletions(-)
diff --git a/bf.go b/bf.go
@@ -104,18 +104,6 @@ func (bf *Brainfuck) Dump() (int, []byte, int, []byte) {
return bf.d, bf.cells[:], bf.i, bf.cmds
}
-// Reset interpreter state.
-func (bf *Brainfuck) Reset() {
- bf.d = 0
- bf.cells = [len(bf.cells)]byte{}
-
- bf.i = 0
- bf.cmds = nil
-
- bf.loops = map[int]int{}
- bf.parLoops = nil
-}
-
// Run runs a Brainfuck program and returns output bytes or error.
func Run(cmds []byte, in io.Reader) ([]byte, error) {
var out bytes.Buffer
diff --git a/cmd/gbfy/main.go b/cmd/gbfy/main.go
@@ -13,9 +13,9 @@ import (
)
var (
- codeFile = flag.String("f", "", "Path to Brainfuck program to execute")
- dataFile = flag.String("d", "", "Path to file containing input data for program")
- endInteractive = flag.Bool("i", false, "Launch interactive interpreter before exit")
+ codeFile = flag.String("f", "", "Path to Brainfuck program to execute")
+ dataFile = flag.String("d", "", "Path to file containing input data for program")
+ launchRepl = flag.Bool("i", false, "Launch interactive interpreter before exit")
)
func main() {
@@ -35,17 +35,15 @@ func main() {
if err := runCodeFile(bf); err != nil {
log.Fatalf("Execution failed: %v", err)
}
- log.Printf("Output from execution: %v\n", out.Bytes())
- } else {
- if err := runPiped(bf); err != nil {
- log.Fatalf("Execution failed: %v", err)
- }
- log.Printf("Output from execution: %v\n", out.Bytes())
+ } else if err := runPiped(bf); err != nil {
+ log.Fatalf("Execution failed: %v", err)
}
- if *endInteractive {
+ if *launchRepl {
log.Println("Starting interactive REPL ...")
- repl(bf, &out)
+ repl(bf, &in, &out)
+ } else {
+ log.Printf("Output from execution: %v\n", out.Bytes())
}
}
@@ -54,7 +52,7 @@ const welcomeMsg = `Go Brainfuck Yourself!
:f[uck] to reset interpreter state
:q[uit] to exit REPL loop`
-func repl(bf *gbfy.Brainfuck, out *bytes.Buffer) {
+func repl(bf *gbfy.Brainfuck, in, out *bytes.Buffer) {
fmt.Println(welcomeMsg)
f, err := os.Open("/dev/tty")
@@ -81,7 +79,8 @@ func repl(bf *gbfy.Brainfuck, out *bytes.Buffer) {
case 'd':
formatDump(bf, out.Bytes())
case 'f':
- bf.Reset()
+ out.Reset() // reset output buffer!
+ bf = gbfy.New(in, out)
fmt.Println("Reset interpreter!")
case 'q':
break