in fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java [117:249]
private Token readToken(Token prevToken) throws IOException
{
boolean skip;
do
{
skip = false;
while (buffer.hasRemaining())
{
char c = getChar();
// delimiters
if (c == '%')
{
// comment
readComment();
}
else if (c == '(')
{
return readString();
}
else if (c == ')')
{
// not allowed outside a string context
throw new IOException("unexpected closing parenthesis");
}
else if (c == '[')
{
return new Token(c, Token.START_ARRAY);
}
else if (c == '{')
{
return new Token(c, Token.START_PROC);
}
else if (c == ']')
{
return new Token(c, Token.END_ARRAY);
}
else if (c == '}')
{
return new Token(c, Token.END_PROC);
}
else if (c == '/')
{
String regular = readRegular();
if (regular == null)
{
// the stream is corrupt
throw new DamagedFontException("Could not read token at position " +
buffer.position());
}
return new Token(regular, Token.LITERAL);
}
else if (c == '<')
{
char c2 = getChar();
if (c2 == c)
{
return new Token("<<", Token.START_DICT);
}
else
{
// code may have to be changed in something better, maybe new token type
buffer.position(buffer.position() - 1);
return new Token(c, Token.NAME);
}
}
else if (c == '>')
{
char c2 = getChar();
if (c2 == c)
{
return new Token(">>", Token.END_DICT);
}
else
{
// code may have to be changed in something better, maybe new token type
buffer.position(buffer.position() - 1);
return new Token(c, Token.NAME);
}
}
else if (Character.isWhitespace(c))
{
skip = true;
}
else if (c == 0)
{
LOG.warn("NULL byte in font, skipped");
skip = true;
}
else
{
buffer.position(buffer.position() -1);
// regular character: try parse as number
Token number = tryReadNumber();
if (number != null)
{
return number;
}
else
{
// otherwise this must be a name
String name = readRegular();
if (name == null)
{
// the stream is corrupt
throw new DamagedFontException("Could not read token at position " +
buffer.position());
}
if (name.equals("RD") || name.equals("-|"))
{
// return the next CharString instead
if (prevToken != null && prevToken.getKind() == Token.INTEGER)
{
return readCharString(prevToken.intValue());
}
else
{
throw new IOException("expected INTEGER before -| or RD");
}
}
else
{
return new Token(name, Token.NAME);
}
}
}
}
}
while (skip);
return null;
}