diff options
Diffstat (limited to 'pkg/pointer/exec.go')
-rw-r--r-- | pkg/pointer/exec.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/pkg/pointer/exec.go b/pkg/pointer/exec.go new file mode 100644 index 0000000..9d55136 --- /dev/null +++ b/pkg/pointer/exec.go @@ -0,0 +1,39 @@ +package pointer + +import ( + "log" + + "git.adyxax.org/adyxax/gofunge/pkg/field" +) + +func (p *Pointer) Exec(f *field.Field) (done bool, returnValue *int) { + c := p.Get(*f) + for jumpingMode := false; jumpingMode || c == ' ' || c == ';'; c = p.StepAndGet(*f) { + if jumpingMode { + if c == ';' { + jumpingMode = false + } + continue + } + } + switch c { + case '@': + return true, nil + case '#': + p.Step(*f) + case 'j': + n := p.Ss.Pop() + for j := 0; j < n; j++ { + p.Step(*f) + } + case 'q': + v := p.Ss.Pop() + return true, &v + default: + if !p.Redirect(c) { + log.Fatalf("Non implemented instruction code %d : %c", c, c) + } + } + p.Step(*f) + return +} |