in src/main/java/org/apache/commons/compress/harmony/unpack200/NewAttributeBands.java [759:836]
private LayoutElement readNextLayoutElement(final StringReader stream) throws IOException {
final int nextChar = stream.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) stream.read() }));
case 'P':
stream.mark(1);
if (stream.read() != 'O') {
stream.reset();
return new Integral("P" + (char) stream.read());
}
return new Integral("PO" + (char) stream.read());
case 'O':
stream.mark(1);
if (stream.read() != 'S') {
stream.reset();
return new Integral("O" + (char) stream.read());
}
return new Integral("OS" + (char) stream.read());
// Replication
case 'N':
final char uintType = (char) stream.read();
stream.read(); // '['
final String str = readUpToMatchingBracket(stream);
return new Replication("" + uintType, str);
// Union
case 'T':
String intType = "" + (char) stream.read();
if (intType.equals("S")) {
intType += (char) stream.read();
}
final List<UnionCase> unionCases = new ArrayList<>();
UnionCase c;
while ((c = readNextUnionCase(stream)) != null) {
unionCases.add(c);
}
stream.read(); // '('
stream.read(); // ')'
stream.read(); // '['
List<LayoutElement> body = null;
stream.mark(1);
final char next = (char) stream.read();
if (next != ']') {
stream.reset();
body = readBody(getStreamUpToMatchingBracket(stream));
}
return new Union(intType, unionCases, body);
// Call
case '(':
final int number = readNumber(stream).intValue();
stream.read(); // ')'
return new Call(number);
// Reference
case 'K':
case 'R':
final StringBuilder string = new StringBuilder("").append((char) nextChar).append((char) stream.read());
final char nxt = (char) stream.read();
string.append(nxt);
if (nxt == 'N') {
string.append((char) stream.read());
}
return new Reference(string.toString());
}
return null;
}