// Copyright 2001, FreeHEP. package org.freehep.postscript; /** * Relational, Boolean and Bitwise Operators for PostScript Processor * * @author Mark Donszelmann * @version $Id: RelationalOperator.java 8958 2006-09-12 23:37:43Z duns $ */ public class RelationalOperator extends PSOperator { public static Class[] operators = { EQ.class, NE.class, GE.class, GT.class, LE.class, LT.class, And.class, Not.class, Or.class, Xor.class, True.class, False.class, BitShift.class }; public boolean execute(OperandStack os) { throw new RuntimeException("Cannot execute class: "+getClass()); } } class EQ extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { PSObject o2 = os.popObject(); PSObject o1 = os.popObject(); os.push(o1.equals(o2)); return true; } } class NE extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { PSObject o2 = os.popObject(); PSObject o1 = os.popObject(); os.push(!o1.equals(o2)); return true; } } class GE extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSNumber.class, PSNumber.class)) { PSNumber n2 = os.popNumber(); PSNumber n1 = os.popNumber(); os.push(n1.compareTo(n2) >= 0); } else if (os.checkType(PSString.class, PSString.class)) { PSString s2 = os.popString(); PSString s1 = os.popString(); os.push(s1.compareTo(s2) >= 0); } else { error(os, new TypeCheck()); } return true; } } class GT extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSNumber.class, PSNumber.class)) { PSNumber n2 = os.popNumber(); PSNumber n1 = os.popNumber(); os.push(n1.compareTo(n2) > 0); } else if (os.checkType(PSString.class, PSString.class)) { PSString s2 = os.popString(); PSString s1 = os.popString(); os.push(s1.compareTo(s2) > 0); } else { error(os, new TypeCheck()); } return true; } } class LE extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSNumber.class, PSNumber.class)) { PSNumber n2 = os.popNumber(); PSNumber n1 = os.popNumber(); os.push(n1.compareTo(n2) <= 0); } else if (os.checkType(PSString.class, PSString.class)) { PSString s2 = os.popString(); PSString s1 = os.popString(); os.push(s1.compareTo(s2) <= 0); } else { error(os, new TypeCheck()); } return true; } } class LT extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSNumber.class, PSNumber.class)) { PSNumber n2 = os.popNumber(); PSNumber n1 = os.popNumber(); os.push(n1.compareTo(n2) < 0); } else if (os.checkType(PSString.class, PSString.class)) { PSString s2 = os.popString(); PSString s1 = os.popString(); os.push(s1.compareTo(s2) < 0); } else { error(os, new TypeCheck()); } return true; } } class And extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSBoolean.class, PSBoolean.class)) { PSBoolean b2 = os.popBoolean(); PSBoolean b1 = os.popBoolean(); os.push(b1.getValue() & b2.getValue()); } else if (os.checkType(PSInteger.class, PSInteger.class)) { PSInteger i2 = os.popInteger(); PSInteger i1 = os.popInteger(); os.push(i1.getValue() & i2.getValue()); } else { error(os, new TypeCheck()); } return true; } } class Not extends RelationalOperator { { operandTypes = new Class[] {PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSBoolean.class)) { PSBoolean b1 = os.popBoolean(); os.push(!b1.getValue()); } else if (os.checkType(PSInteger.class)) { PSInteger i1 = os.popInteger(); os.push(~i1.getValue()); } else { error(os, new TypeCheck()); } return true; } } class Or extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSBoolean.class, PSBoolean.class)) { PSBoolean b2 = os.popBoolean(); PSBoolean b1 = os.popBoolean(); os.push(b1.getValue() | b2.getValue()); } else if (os.checkType(PSInteger.class, PSInteger.class)) { PSInteger i2 = os.popInteger(); PSInteger i1 = os.popInteger(); os.push(i1.getValue() | i2.getValue()); } else { error(os, new TypeCheck()); } return true; } } class Xor extends RelationalOperator { { operandTypes = new Class[] {PSObject.class, PSObject.class}; } public boolean execute(OperandStack os) { if (os.checkType(PSBoolean.class, PSBoolean.class)) { PSBoolean b2 = os.popBoolean(); PSBoolean b1 = os.popBoolean(); os.push(b1.getValue() ^ b2.getValue()); } else if (os.checkType(PSInteger.class, PSInteger.class)) { PSInteger i2 = os.popInteger(); PSInteger i1 = os.popInteger(); os.push(i1.getValue() ^ i2.getValue()); } else { error(os, new TypeCheck()); } return true; } } class True extends RelationalOperator { public boolean execute(OperandStack os) { os.push(true); return true; } } class False extends RelationalOperator { public boolean execute(OperandStack os) { os.push(false); return true; } } class BitShift extends RelationalOperator { { operandTypes = new Class[] {PSInteger.class, PSInteger.class}; } public boolean execute(OperandStack os) { int shift = os.popInteger().getValue(); int i = os.popInteger().getValue(); if (shift < 0) { os.push(i >> Math.abs(shift)); } else { os.push(i << shift); } return true; } }