94 lines
3 KiB
Go
94 lines
3 KiB
Go
|
// Copyright 2010 The postscript-go Authors. All rights reserved.
|
|||
|
// created: 13/12/2010 by Laurent Le Goff
|
|||
|
|
|||
|
package postscript
|
|||
|
|
|||
|
|
|||
|
import ()
|
|||
|
//int array array -> Create array of length int
|
|||
|
func array(interpreter *Interpreter) {
|
|||
|
interpreter.Push(make([]Value, interpreter.PopInt()))
|
|||
|
}
|
|||
|
//array length int -> Return number of elements in array
|
|||
|
func lengtharray(interpreter *Interpreter) {
|
|||
|
interpreter.Push(float64(len(interpreter.Pop().([]Value))))
|
|||
|
}
|
|||
|
//array index get any -> Return array element indexed by index
|
|||
|
func getarray(interpreter *Interpreter) {
|
|||
|
index := interpreter.PopInt()
|
|||
|
array := interpreter.Pop().([]Value)
|
|||
|
interpreter.Push(array[index])
|
|||
|
}
|
|||
|
//array index any put – -> Put any into array at index
|
|||
|
func putarray(interpreter *Interpreter) {
|
|||
|
value := interpreter.Pop()
|
|||
|
index := interpreter.PopInt()
|
|||
|
array := interpreter.Pop().([]Value)
|
|||
|
array[index] = value
|
|||
|
}
|
|||
|
//array index count getinterval subarray -> Return subarray of array starting at index for count elements
|
|||
|
func getinterval(interpreter *Interpreter) {
|
|||
|
count := interpreter.PopInt()
|
|||
|
index := interpreter.PopInt()
|
|||
|
array := interpreter.Pop().([]Value)
|
|||
|
subarray := make([]Value, count)
|
|||
|
copy(subarray, array[index:index+count])
|
|||
|
interpreter.Push(subarray)
|
|||
|
}
|
|||
|
//array1 index array2 putinterval – Replace subarray of array1 starting at index by array2|packedarray2
|
|||
|
func putinterval(interpreter *Interpreter) {
|
|||
|
array2 := interpreter.Pop().([]Value)
|
|||
|
index := interpreter.PopInt()
|
|||
|
array1 := interpreter.Pop().([]Value)
|
|||
|
for i, v := range array2 {
|
|||
|
array1[i+index] = v
|
|||
|
}
|
|||
|
}
|
|||
|
// any0 … anyn−1 array astore array
|
|||
|
// stores the objects any0 to anyn−1 from the operand stack into array, where n is the length of array
|
|||
|
func astore(interpreter *Interpreter) {
|
|||
|
array := interpreter.Pop().([]Value)
|
|||
|
n := len(array)
|
|||
|
for i := 0; i < n; i++ {
|
|||
|
array[i] = interpreter.Pop()
|
|||
|
}
|
|||
|
}
|
|||
|
//array aload any0 … any-1 array
|
|||
|
//Push all elements of array on stack
|
|||
|
func aload(interpreter *Interpreter) {
|
|||
|
array := interpreter.Pop().([]Value)
|
|||
|
for _, v := range array {
|
|||
|
interpreter.Push(v)
|
|||
|
}
|
|||
|
interpreter.Push(array)
|
|||
|
}
|
|||
|
//array proc forall – Execute proc for each element of array
|
|||
|
func forallarray(interpreter *Interpreter) {
|
|||
|
proc := NewProcedure(interpreter.PopProcedureDefinition())
|
|||
|
array := interpreter.Pop().([]Value)
|
|||
|
for _, v := range array {
|
|||
|
interpreter.Push(v)
|
|||
|
proc.Execute(interpreter)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var packing bool = false
|
|||
|
|
|||
|
func currentpacking(interpreter *Interpreter) {
|
|||
|
interpreter.Push(packing)
|
|||
|
}
|
|||
|
func setpacking(interpreter *Interpreter) {
|
|||
|
packing = interpreter.PopBoolean()
|
|||
|
}
|
|||
|
|
|||
|
func initArrayOperators(interpreter *Interpreter) {
|
|||
|
interpreter.SystemDefine("array", NewOperator(array))
|
|||
|
interpreter.SystemDefine("getinterval", NewOperator(getinterval))
|
|||
|
interpreter.SystemDefine("putinterval", NewOperator(putinterval))
|
|||
|
interpreter.SystemDefine("astore", NewOperator(astore))
|
|||
|
interpreter.SystemDefine("aload", NewOperator(aload))
|
|||
|
interpreter.SystemDefine("currentpacking", NewOperator(currentpacking))
|
|||
|
interpreter.SystemDefine("setpacking", NewOperator(setpacking))
|
|||
|
|
|||
|
}
|