private LayoutElement readNextLayoutElement()

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;
    }