2010-12-13 12:01:24 +00:00
|
|
|
// Copyright 2010 The postscript-go Authors. All rights reserved.
|
|
|
|
// created: 13/12/2010 by Laurent Le Goff
|
|
|
|
|
2010-12-13 08:59:26 +00:00
|
|
|
package postscript
|
|
|
|
|
|
|
|
type ProcedureDefinition struct {
|
|
|
|
Values []Value
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewProcedureDefinition() *ProcedureDefinition {
|
|
|
|
proceduredef := new(ProcedureDefinition)
|
|
|
|
proceduredef.Values = make([]Value, 0, 100)
|
|
|
|
return proceduredef
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *ProcedureDefinition) Add(value Value) {
|
|
|
|
p.Values = append(p.Values, value)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Procedure struct {
|
|
|
|
def *ProcedureDefinition
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewProcedure(def *ProcedureDefinition) *Procedure {
|
|
|
|
return &Procedure{def}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Procedure) Execute(interpreter *Interpreter) {
|
|
|
|
for _, value := range p.def.Values {
|
|
|
|
if s, ok := value.(string); ok {
|
|
|
|
firstChar := s[0]
|
|
|
|
if firstChar != '(' && firstChar != '/' {
|
|
|
|
interpreter.computeReference(s)
|
|
|
|
} else {
|
|
|
|
interpreter.Push(value)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
operator, isOperator := value.(Operator)
|
|
|
|
if isOperator {
|
|
|
|
operator.Execute(interpreter)
|
|
|
|
} else {
|
|
|
|
interpreter.Push(value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|