in fop-core/src/main/java/org/apache/fop/fonts/type1/PostscriptParser.java [52:135]
public List<PSElement> parse(byte[] segment) throws IOException {
List<PSElement> parsedElements = new ArrayList<PSElement>();
/* Currently only scan and store the top level element. For deeper
* Postscript parsing you can push and pop elements from a stack */
PSElement foundElement = null;
String operator = null;
StringBuilder token = new StringBuilder();
List<String> tokens = new ArrayList<String>();
int startPoint = -1;
boolean specialDelimiter = false;
boolean lastWasSpecial = false;
for (int i = 0; i < segment.length; i++) {
byte cur = segment[i];
if (foundElement != null && foundElement.hasMore()) {
foundElement.parse(cur, i);
continue;
} else {
char c = (char)cur;
if (!lastWasSpecial) {
specialDelimiter = (c == '{' || c == '}' || c == '[' || c == ']'
|| (!token.toString().equals("") && c == '/'));
boolean isNotBreak = !(c == ' ' || c == '\r' || cur == 15 || cur == 12
|| cur == 10);
if (isNotBreak && !specialDelimiter) {
token.append(c);
continue;
}
} else {
lastWasSpecial = false;
token.append(c);
if (token.toString().equals("/")) {
continue;
}
}
}
try {
boolean setOp = false;
if ((foundElement == null || !foundElement.hasMore()) && token.length() > 1
&& token.charAt(0) == '/' && tokens.size() != 1 || hasEndToken(token.toString())) {
operator = token.toString();
setOp = true;
if (tokens.size() > 2 && tokens.get(tokens.size() - 1).equals("def")) {
PSVariable newVar = new PSVariable(tokens.get(0), startPoint);
newVar.setValue(tokens.get(1));
newVar.setEndPoint(i - operator.length());
parsedElements.add(newVar);
}
tokens.clear();
startPoint = i - token.length();
}
if (operator != null) {
if (foundElement instanceof PSSubroutine) {
PSSubroutine sub = (PSSubroutine)foundElement;
subroutines.put(sub.getOperator(), sub);
parsedElements.add(sub);
if (!setOp) {
operator = "";
}
} else {
if (foundElement != null) {
if (!hasMatch(foundElement.getOperator(), parsedElements)) {
parsedElements.add(foundElement);
} else {
LOG.warn("Duplicate " + foundElement.getOperator()
+ " in font file, Ignoring.");
}
}
}
//Compare token against patterns and create an element if matched
foundElement = createElement(operator, token.toString(), startPoint);
}
} finally {
tokens.add(token.toString());
token = new StringBuilder();
if (specialDelimiter) {
specialDelimiter = false;
lastWasSpecial = true;
//Retrace special postscript character so it can be processed separately
i--;
}
}
}
return parsedElements;
}