package com.sun.pdfview.function.postscript.operation;
import java.util.Stack;
final class Copy implements PostScriptOperation {
@Override
/**
* <i>any1 ... anyn n</i> <b>copy</b> <i>any1 ... anyn any1 ... anyn</i>
* <i>array1 array2</i> <b>copy</b> <i>subarray2</i> <br>
* <i>string1 string2</i> <b>copy</b> <i>substring2</i> <p>
*
* performs two entirely different functions, depending on the
* type of the topmost operand.
* In the first form, where the top element on the operand
* stack is a nonnegative integer n, copy pops n from the
* stack and duplicates the top n elements on the stack
* as shown above. This form of copy operates only on the
* objects themselves, not on the values of composite objects. <p>
*
* Examples<br>
* (a) (b) (c) 2 copy Þ (a) (b) (c) (b) (c) <br>
* (a) (b) (c) 0 copy Þ (a) (b) (c) <p>
*
* In the other forms, copy copies all the elements of the
* first composite object into the second. The composite
* object operands must be of the same type, except that
* a packed array can be copied into an array (and only into
* an array—copy cannot copy into packed arrays, because
* they are read-only). This form of copy copies the value of
* a composite object. This is quite different from dup and
* other operators that copy only the objects themselves
* (see Section 3.3.1, "Simple and Composite Objects").
* However, copy performs only one level of copying.
* It does not apply recursively to elements that are
* themselves composite objects; instead, the values
* of those elements become shared. In the case of arrays or
* strings, the length of the second object must be at least as
* great as the first; copy returns the initial subarray or
* substring of the second operand into which the elements
* were copied. Any remaining elements of array2 or
* string2 are unaffected. <p>
*
* Example: <br>
* /a1 [1 2 3] def<br>
* a1 dup length array copy Þ [1 2 3] <p>
*
* errors: invalidaccess, rangecheck, stackoverflow,
* stackunderflow, typecheck
*/
public void eval(Stack<Object> environment) {
Number count = (Number) environment.pop();
// ????
Object[] buffer = new Object[count.intValue()];
for (int i = 0; i < buffer.length; i++) {
buffer[i] = environment.pop();
}
for (int i = 0; i < buffer.length; i++) {
environment.push(buffer[buffer.length-i-1]);
}
for (int i = 0; i < buffer.length; i++) {
environment.push(buffer[buffer.length-i-1]);
}
}
}