2011-04-27 08:06:14 +00:00
|
|
|
|
// Copyright 2010 The postscript-go Authors. All rights reserved.
|
|
|
|
|
// created: 13/12/2010 by Laurent Le Goff
|
|
|
|
|
|
|
|
|
|
package postscript
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"log"
|
|
|
|
|
)
|
2012-03-29 14:52:12 +00:00
|
|
|
|
|
2011-04-27 08:06:14 +00:00
|
|
|
|
// any exec – Execute arbitrary object
|
|
|
|
|
func exec(interpreter *Interpreter) {
|
|
|
|
|
value := interpreter.Pop()
|
|
|
|
|
if pdef, ok := value.(*ProcedureDefinition); ok {
|
|
|
|
|
NewProcedure(pdef).Execute(interpreter)
|
|
|
|
|
} else if procedure, ok := value.(*Procedure); ok {
|
|
|
|
|
procedure.Execute(interpreter)
|
|
|
|
|
} else {
|
|
|
|
|
log.Printf("Push value: %v\n", value)
|
|
|
|
|
interpreter.Push(value)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ifoperator(interpreter *Interpreter) {
|
|
|
|
|
operator := NewProcedure(interpreter.PopProcedureDefinition())
|
|
|
|
|
condition := interpreter.PopBoolean()
|
|
|
|
|
if condition {
|
|
|
|
|
operator.Execute(interpreter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ifelse(interpreter *Interpreter) {
|
|
|
|
|
operator2 := NewProcedure(interpreter.PopProcedureDefinition())
|
|
|
|
|
operator1 := NewProcedure(interpreter.PopProcedureDefinition())
|
|
|
|
|
condition := interpreter.PopBoolean()
|
|
|
|
|
if condition {
|
|
|
|
|
operator1.Execute(interpreter)
|
|
|
|
|
} else {
|
|
|
|
|
operator2.Execute(interpreter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func foroperator(interpreter *Interpreter) {
|
|
|
|
|
proc := NewProcedure(interpreter.PopProcedureDefinition())
|
|
|
|
|
limit := interpreter.PopFloat()
|
|
|
|
|
inc := interpreter.PopFloat()
|
|
|
|
|
initial := interpreter.PopFloat()
|
|
|
|
|
|
|
|
|
|
for i := initial; i <= limit; i += inc {
|
|
|
|
|
interpreter.Push(i)
|
|
|
|
|
proc.Execute(interpreter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func repeat(interpreter *Interpreter) {
|
|
|
|
|
proc := NewProcedure(interpreter.PopProcedureDefinition())
|
|
|
|
|
times := interpreter.PopInt()
|
|
|
|
|
for i := 0; i <= times; i++ {
|
|
|
|
|
proc.Execute(interpreter)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// any stopped bool -> Establish context for catching stop
|
|
|
|
|
func stopped(interpreter *Interpreter) {
|
|
|
|
|
value := interpreter.Pop()
|
|
|
|
|
if pdef, ok := value.(*ProcedureDefinition); ok {
|
|
|
|
|
NewProcedure(pdef).Execute(interpreter)
|
|
|
|
|
} else {
|
|
|
|
|
interpreter.Push(value)
|
|
|
|
|
}
|
|
|
|
|
interpreter.Push(false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func initControlOperators(interpreter *Interpreter) {
|
|
|
|
|
interpreter.SystemDefine("exec", NewOperator(exec))
|
|
|
|
|
interpreter.SystemDefine("if", NewOperator(ifoperator))
|
|
|
|
|
interpreter.SystemDefine("ifelse", NewOperator(ifelse))
|
|
|
|
|
interpreter.SystemDefine("for", NewOperator(foroperator))
|
|
|
|
|
interpreter.SystemDefine("repeat", NewOperator(repeat))
|
|
|
|
|
interpreter.SystemDefine("stopped", NewOperator(stopped))
|
|
|
|
|
}
|