int getNextXMLToken()

in rhino/src/main/java/org/mozilla/javascript/TokenStream.java [1865:2017]


    int getNextXMLToken() throws IOException {
        tokenStartLastLineEnd = lastLineEnd;
        tokenStartLineno = lineno;
        tokenBeg = cursor;
        stringBufferTop = 0; // remember the XML

        for (int c = getChar(); c != EOF_CHAR; c = getChar()) {
            if (xmlIsTagContent) {
                switch (c) {
                    case '>':
                        addToString(c);
                        xmlIsTagContent = false;
                        xmlIsAttribute = false;
                        break;
                    case '/':
                        addToString(c);
                        if (peekChar() == '>') {
                            c = getChar();
                            addToString(c);
                            xmlIsTagContent = false;
                            xmlOpenTagsCount--;
                        }
                        break;
                    case '{':
                        ungetChar(c);
                        this.string = getStringFromBuffer();
                        return Token.XML;
                    case '\'':
                    case '"':
                        addToString(c);
                        if (!readQuotedString(c)) return Token.ERROR;
                        break;
                    case '=':
                        addToString(c);
                        xmlIsAttribute = true;
                        break;
                    case ' ':
                    case '\t':
                    case '\r':
                    case '\n':
                        addToString(c);
                        break;
                    default:
                        addToString(c);
                        xmlIsAttribute = false;
                        break;
                }

                if (!xmlIsTagContent && xmlOpenTagsCount == 0) {
                    this.string = getStringFromBuffer();
                    cursor = sourceCursor;
                    tokenEnd = cursor;
                    return Token.XMLEND;
                }
            } else {
                switch (c) {
                    case '<':
                        addToString(c);
                        c = peekChar();
                        switch (c) {
                            case '!':
                                c = getChar(); // Skip !
                                addToString(c);
                                c = peekChar();
                                switch (c) {
                                    case '-':
                                        c = getChar(); // Skip -
                                        addToString(c);
                                        c = getChar();
                                        if (c == '-') {
                                            addToString(c);
                                            if (!readXmlComment()) return Token.ERROR;
                                        } else {
                                            // throw away the string in progress
                                            stringBufferTop = 0;
                                            this.string = null;
                                            parser.addError("msg.XML.bad.form");
                                            return Token.ERROR;
                                        }
                                        break;
                                    case '[':
                                        c = getChar(); // Skip [
                                        addToString(c);
                                        if (getChar() == 'C'
                                                && getChar() == 'D'
                                                && getChar() == 'A'
                                                && getChar() == 'T'
                                                && getChar() == 'A'
                                                && getChar() == '[') {
                                            addToString('C');
                                            addToString('D');
                                            addToString('A');
                                            addToString('T');
                                            addToString('A');
                                            addToString('[');
                                            if (!readCDATA()) return Token.ERROR;

                                        } else {
                                            // throw away the string in progress
                                            stringBufferTop = 0;
                                            this.string = null;
                                            parser.addError("msg.XML.bad.form");
                                            return Token.ERROR;
                                        }
                                        break;
                                    default:
                                        if (!readEntity()) return Token.ERROR;
                                        break;
                                }
                                break;
                            case '?':
                                c = getChar(); // Skip ?
                                addToString(c);
                                if (!readPI()) return Token.ERROR;
                                break;
                            case '/':
                                // End tag
                                c = getChar(); // Skip /
                                addToString(c);
                                if (xmlOpenTagsCount == 0) {
                                    // throw away the string in progress
                                    stringBufferTop = 0;
                                    this.string = null;
                                    parser.addError("msg.XML.bad.form");
                                    return Token.ERROR;
                                }
                                xmlIsTagContent = true;
                                xmlOpenTagsCount--;
                                break;
                            default:
                                // Start tag
                                xmlIsTagContent = true;
                                xmlOpenTagsCount++;
                                break;
                        }
                        break;
                    case '{':
                        ungetChar(c);
                        this.string = getStringFromBuffer();
                        return Token.XML;
                    default:
                        addToString(c);
                        break;
                }
            }
        }

        tokenEnd = cursor;
        stringBufferTop = 0; // throw away the string in progress
        this.string = null;
        parser.addError("msg.XML.bad.form");
        return Token.ERROR;
    }