aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/llgcode/ps/operators_control.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/llgcode/ps/operators_control.go')
-rw-r--r--vendor/github.com/llgcode/ps/operators_control.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/vendor/github.com/llgcode/ps/operators_control.go b/vendor/github.com/llgcode/ps/operators_control.go
new file mode 100644
index 0000000..1aa411c
--- /dev/null
+++ b/vendor/github.com/llgcode/ps/operators_control.go
@@ -0,0 +1,80 @@
+// Copyright 2010 The postscript-go Authors. All rights reserved.
+// created: 13/12/2010 by Laurent Le Goff
+
+package ps
+
+import (
+ "log"
+)
+
+// 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))
+}