// Copyright 2001, FreeHEP.
package org.freehep.postscript;
/**
* Error Operators for PostScript Processor
*
* @author Mark Donszelmann
* @version $Id: ErrorOperator.java 8958 2006-09-12 23:37:43Z duns $
*/
public abstract class ErrorOperator extends PSOperator {
public static Class[] operators = {
ConfigurationError.class, DictFull.class, DictStackOverflow.class,
DictStackUnderflow.class, ExecStackOverflow.class, HandleError.class,
Interrupt.class, InvalidAccess.class, InvalidExit.class,
InvalidFileAccess.class, InvalidFont.class, InvalidRestore.class,
IOError.class, LimitCheck.class, NoCurrentPoint.class,
RangeCheck.class, StackOverflow.class, StackUnderflow.class,
SyntaxError.class, Timeout.class, TypeCheck.class,
Undefined.class, UndefinedFileName.class, UndefinedResource.class,
UndefinedResult.class, UnmatchedMark.class,
Unregistered.class, VMError.class, Unimplemented.class
};
// default error handler
public boolean execute(OperandStack os) {
// fill error dict
PSDictionary error = os.dictStack().dollarError();
error.put("newerror", new PSBoolean(true));
error.put("errorname", new PSName(getName()));
error.put("command", os.execStack().peekObject(1));
if (error.get("recordstacks").equals(new PSBoolean(true))) {
error.put("ostack", stackToArray(os));
error.put("estack", stackToArray(os.execStack()));
error.put("dstack", stackToArray(os.dictStack()));
}
// now execute stop
os.execStack().pop();
os.execStack().push("stop");
return false;
}
private static PSArray stackToArray(PostScriptStack stack) {
PSArray array = new PSArray(stack.size());
stack.copyInto(array);
return array;
}
}
class ConfigurationError extends ErrorOperator {
}
class DictFull extends ErrorOperator {
}
class DictStackOverflow extends ErrorOperator {
}
class DictStackUnderflow extends ErrorOperator {
}
class ExecStackOverflow extends ErrorOperator {
}
class HandleError extends ErrorOperator {
// FIXME, should print more
public boolean execute(OperandStack os) {
// report on error
PSDictionary error = os.dictStack().dollarError();
if (error.get("newerror").equals(new PSBoolean(true))) {
System.err.print("\n\n%%[Error: ");
System.err.print(error.get("errorname").toPrint());
System.err.print("; Offending Command: ");
System.err.print(error.get("command").toPrint());
System.err.println("]%%\n");
if (!error.get("errorinfo").equals(new PSNull())) {
System.err.print("Error Info: ");
System.err.println(error.get("errorinfo").toPrint());
System.err.println();
}
if (error.get("recordstacks").equals(new PSBoolean(true))) {
System.err.println("Operand Stack (bottom..top)");
System.err.println(error.get("ostack").toPrint());
System.err.println();
System.err.println("Execution Stack (bottom..top)");
System.err.println(error.get("estack").toPrint());
System.err.println();
System.err.println("Dictionary Stack (bottom..top)");
System.err.println(error.get("dstack").toPrint());
System.err.println();
}
// reset error dict
error.put("newerror", new PSBoolean(false));
error.put("errorinfo", new PSNull());
}
return true;
}
}
class Interrupt extends ErrorOperator {
public boolean execute(OperandStack os) {
os.execStack().pop();
os.execStack().push("stop");
return false;
}
}
class InvalidAccess extends ErrorOperator {
}
class InvalidExit extends ErrorOperator {
}
class InvalidFileAccess extends ErrorOperator {
}
class InvalidFont extends ErrorOperator {
}
class InvalidRestore extends ErrorOperator {
}
class IOError extends ErrorOperator {
}
class LimitCheck extends ErrorOperator {
}
class NoCurrentPoint extends ErrorOperator {
}
class RangeCheck extends ErrorOperator {
}
class StackOverflow extends ErrorOperator {
}
class StackUnderflow extends ErrorOperator {
}
class SyntaxError extends ErrorOperator {
}
class Timeout extends ErrorOperator {
public boolean execute(OperandStack os) {
os.execStack().pop();
os.execStack().push("stop");
return false;
}
}
class TypeCheck extends ErrorOperator {
}
class Undefined extends ErrorOperator {
}
class UndefinedFileName extends ErrorOperator {
}
class UndefinedResource extends ErrorOperator {
}
class UndefinedResult extends ErrorOperator {
}
class UnmatchedMark extends ErrorOperator {
}
class Unregistered extends ErrorOperator {
}
class VMError extends ErrorOperator {
public String getName() {
return "VMerror";
}
}
// Not part of standard, added while implementation is not complete
class Unimplemented extends ErrorOperator {
}