/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS
* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.icepdf.core.pobjects.functions.postscript;
/**
* OperatorsNames purpose is to define all operators in the PostScript type 4
* function definitions. The function also provides an accelerated operand
* lookup method #getType() which returns an integer representation of the
* operand so that it can be quickly compared/processed at a later time.
*
* @author ICEsoft Technologies Inc.
* @since 4.2
*/
public class OperatorNames {
/**
* Gets the operator type specified by the input substring. PostScript
* operands should all be lower case but this function will handle upper
* and mixed case if encountered.
*
* @param ch character array containing postscript calculator function.
* @param offset starting offset of input substring.
* @param length length of input substring.
* @return integer representing the operand found as described in class
* constants.
*/
public static int getType(char ch[], int offset, int length) {
char c1, c2;
char c = ch[offset];
// quickly switch though possible operands to find matching operands
// as quickly as possible.
switch (c) {
case 'a': // abs | add | atan
case 'A':
if (length == 4) return OP_ATAN;
c1 = ch[offset + 1];
if (c1 == 'b' || c1 == 'B') {
return OP_ABS;
} else if (c1 == 'd' || c1 == 'D') {
return OP_ADD;
}
break;
case 'b': // bitshift
case 'B':
return OP_BITSHIFT;
case 'c': // ceiling | cos | copy | cvi | cvr
case 'C':
if (length == 8) return OP_CEILING;
if (length == 4) return OP_COPY;
c1 = ch[offset + 1];
if (c1 == 'o' || c1 == 'O') {
return OP_COS;
} else if (c1 == 'v' || c1 == 'V') {
c2 = ch[offset + 2];
if (c2 == 'i' || c2 == 'I') {
return OP_CVI;
} else if (c2 == 'r' || c2 == 'R') {
return OP_CVR;
}
}
break;
case 'd': // div | dup
case 'D':
c1 = ch[offset + 1];
if (c1 == 'i' || c1 == 'I') {
return OP_DIV;
} else if (c1 == 'u' || c1 == 'U') {
return OP_DUP;
}
break;
case 'e': // eq | exch | exp
case 'E':
if (length == 2) return OP_EQ;
if (length == 3) return OP_EXP;
if (length == 4) return OP_EXCH;
break;
case 'f': // floor
case 'F':
return OP_FLOOR;
case 'g': // div | dup
case 'G':
c1 = ch[offset + 1];
if (c1 == 'e' || c1 == 'E') {
return OP_GE;
} else if (c1 == 't' || c1 == 'T') {
return OP_GT;
}
break;
case 'i': // idif | if | ifelse | in | index
case 'I':
if (length == 6) return OP_IFELSE;
c1 = ch[offset + 1];
if (c1 == 'd' || c1 == 'D') {
return OP_IDIV;
} else if (c1 == 'f' || c1 == 'F') {
return OP_IF;
} else if (c1 == 'n' || c1 == 'N') {
if (length == 5) return OP_INDEX;
if (length == 2) return OP_LN;
}
break;
case 'l': // le | log | lt
case 'L':
if (length == 3) return OP_LOG;
c1 = ch[offset + 1];
if (c1 == 'e' || c1 == 'E') {
return OP_LE;
} else if (c1 == 't' || c1 == 'T') {
return OP_LT;
}
break;
case 'm': // mod | mul
case 'M':
c1 = ch[offset + 1];
if (c1 == 'o' || c1 == 'O') {
return OP_MOD;
} else if (c1 == 'u' || c1 == 'U') {
return OP_MUL;
}
break;
case 'n': // ne | neg | not
case 'N':
if (length == 2) return OP_NE;
c1 = ch[offset + 1];
if (c1 == 'e' || c1 == 'e') {
return OP_NEG;
} else if (c1 == 'o' || c1 == 'O') {
return OP_NOT;
}
break;
case 'o': // or
case 'O':
return OP_OR;
case 'p': // pop
case 'P':
return OP_POP;
case 'r': // roll | round
case 'R':
if (length == 4) return OP_ROLL;
if (length == 5) return OP_ROUND;
break;
case 's': // sin | sqrt | sub
case 'S':
if (length == 4) return OP_SQRT;
c1 = ch[offset + 1];
if (c1 == 'u' || c1 == 'U') {
return OP_SUB;
} else if (c1 == 'i' || c1 == 'I') {
return OP_SIN;
}
break;
case 't': // truncate
case 'T':
return OP_TRUNCATE;
case 'x': // xor
case 'X':
return OP_XOR;
case '{':
return OP_EXP_START;
case '}':
return OP_EXP_END;
}
return NO_OP;
}
/**
* Postscript subset of operations used in a type 4 function PostScript
* calculator.
*/
public final static int
NO_OP = 0,
OP_ABS = 1,
OP_ADD = 2,
OP_AND = 3,
OP_ATAN = 4,
OP_BITSHIFT = 5,
OP_CEILING = 6,
OP_COS = 7,
OP_COPY = 8,
OP_CVI = 9,
OP_CVR = 10,
OP_DIV = 11,
OP_DUP = 12,
OP_EQ = 13,
OP_EXCH = 14,
OP_EXP = 15,
OP_FALSE = 16,
OP_FLOOR = 17,
OP_GE = 18,
OP_GT = 19,
OP_IDIV = 20,
OP_IF = 21,
OP_IFELSE = 22,
OP_LN = 23,
OP_INDEX = 24,
OP_LE = 25,
OP_LOG = 26,
OP_LT = 27,
OP_MOD = 28,
OP_MUL = 29,
OP_NE = 30,
OP_NEG = 31,
OP_NOT = 32,
OP_OR = 33,
OP_POP = 34,
OP_ROLL = 35,
OP_ROUND = 36,
OP_SIN = 37,
OP_SQRT = 38,
OP_SUB = 39,
OP_TRUE = 40,
OP_TRUNCATE = 41,
OP_XOR = 42,
OP_EXP_START = 43,
OP_EXP_END = 44,
OP_PROC = 45;
}