in src/main/java/org/apache/commons/compress/harmony/pack200/NewAttributeBands.java [697:777]
private LayoutElement readNextLayoutElement(final StringReader reader) throws IOException {
final int nextChar = reader.read();
if (nextChar == -1) {
return null;
}
switch (nextChar) {
// Integrals
case 'B':
case 'H':
case 'I':
case 'V':
return new Integral(new String(new char[] { (char) nextChar }));
case 'S':
case 'F':
return new Integral(new String(new char[] { (char) nextChar, (char) reader.read() }));
case 'P':
reader.mark(1);
if (reader.read() != 'O') {
reader.reset();
lastPIntegral = new Integral("P" + (char) reader.read());
return lastPIntegral;
}
lastPIntegral = new Integral("PO" + (char) reader.read(), lastPIntegral);
return lastPIntegral;
case 'O':
reader.mark(1);
if (reader.read() != 'S') {
reader.reset();
return new Integral("O" + (char) reader.read(), lastPIntegral);
}
return new Integral("OS" + (char) reader.read(), lastPIntegral);
// Replication
case 'N':
final char uint_type = (char) reader.read();
reader.read(); // '['
final String str = readUpToMatchingBracket(reader);
return new Replication("" + uint_type, str);
// Union
case 'T':
String int_type = String.valueOf((char) reader.read());
if (int_type.equals("S")) {
int_type += (char) reader.read();
}
final List<UnionCase> unionCases = new ArrayList<>();
UnionCase c;
while ((c = readNextUnionCase(reader)) != null) {
unionCases.add(c);
}
reader.read(); // '('
reader.read(); // ')'
reader.read(); // '['
List<LayoutElement> body = null;
reader.mark(1);
final char next = (char) reader.read();
if (next != ']') {
reader.reset();
body = readBody(getStreamUpToMatchingBracket(reader));
}
return new Union(int_type, unionCases, body);
// Call
case '(':
final int number = readNumber(reader).intValue();
reader.read(); // ')'
return new Call(number);
// Reference
case 'K':
case 'R':
final StringBuilder string = new StringBuilder("").append((char) nextChar).append((char) reader.read());
final char nxt = (char) reader.read();
string.append(nxt);
if (nxt == 'N') {
string.append((char) reader.read());
}
return new Reference(string.toString());
}
return null;
}