39 lines
650 B
Go
39 lines
650 B
Go
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
|
|
}
|