public void token()

in nbxml/src/main/java/org/apache/vysper/xml/sax/impl/XMLParser.java [128:304]


    public void token(char c, String token) throws SAXException {
        if (log.isTraceEnabled()) {
            String s = (token == null) ? Character.toString(c) : token;
            log.trace("Parser got token {} in state {}", s, state);
        }

        switch (state) {
        case START:
            if (c == '<') {
                state = State.IN_TAG;
                attributes = new HashMap<String, String>();
            } else {
                characters(token);
            }
            break;
        case IN_TAG:
            // token must be element name or / for a end tag
            if (c == '/') {
                state = State.IN_END_TAG;
            } else if (c == '?') {
                state = State.IN_DECLARATION;
                xmlDeclaration();
            } else if (c == '!') {
                if (commentsAllowed) {
                    state = State.AFTER_COMMENT_BANG;
                } else {
                    fatalError("Comments not allowed");
                    return;
                }
            } else {
                if (token != null && isValidName(token)) {
                    qname = token;
                    state = State.AFTER_START_NAME;
                } else {
                    if(token != null) {
                        fatalError("Invalid element name: " + qname);
                    } else {
                        fatalError("Not well-formed start tag");
                    }
                    return;
                }
            }
            break;
        case IN_END_TAG:
            // token must be element name
            qname = token;
            state = State.AFTER_END_NAME;
            break;
        case AFTER_START_NAME:
            // token must be attribute name or > or /
            if (c == '>') {
                // end of start or end tag
                if (state == State.AFTER_START_NAME) {
                    startElement();
                    state = State.START;
                    attributes = null;
                } else if (state == State.AFTER_END_NAME) {
                    state = State.START;
                    endElement();
                }
            } else if (c == '/') {
                state = State.IN_EMPTY_TAG;
            } else {
                // must be attribute name
                attributeName = token;
                state = State.AFTER_ATTRIBUTE_NAME;
            }
            break;
        case AFTER_ATTRIBUTE_NAME:
            // token must be =
            if (c == '=') {
                state = State.AFTER_ATTRIBUTE_EQUALS;
            } else {
                fatalError("Not wellformed");
            }
            break;
        case AFTER_ATTRIBUTE_EQUALS:
            // token must be " or '
            if (c == '"' || c == '\'') {
                state = State.AFTER_ATTRIBUTE_FIRST_QUOTE;
            }
            break;
        case AFTER_ATTRIBUTE_FIRST_QUOTE:
            // token must be attribute value
            attributes.put(attributeName, unescape(token));
            state = State.AFTER_ATTRIBUTE_VALUE;
            break;
        case AFTER_ATTRIBUTE_VALUE:
            // token must be " or '
            if (c == '"' || c == '\'') {
                state = State.AFTER_START_NAME;
            } else {
                fatalError("Not wellformed");
            }
            break;
        case AFTER_END_NAME:
            // token must be >
            if (c == '>') {
                state = State.START;
                endElement();
            }
            break;
        case IN_EMPTY_TAG:
            // token must be >
            if (c == '>') {
                startElement();
                attributes = null;

                if (state != State.CLOSED) {
                    state = State.START;
                    endElement();
                }
            }
            break;
        case AFTER_COMMENT_BANG:
            // token must be -
            if (c == '-') {
                state = State.AFTER_COMMENT_DASH1;
            } else {
                fatalError("Comment not wellformed");
                return;
            }
            break;
        case AFTER_COMMENT_DASH1:
            // token must be -
            if (c == '-') {
                state = State.AFTER_COMMENT_DASH2;
            } else {
                fatalError("Comment not wellformed");
                return;
            }
            break;
        case AFTER_COMMENT_DASH2:
            // we should now get the comment content, ignore
            if (c == '-') {
                state = State.AFTER_COMMENT_CLOSING_DASH1;
            } else {
                state = State.AFTER_COMMENT;
            }
            break;
        case AFTER_COMMENT:
            // token must be - or some text
            if (c == '-') {
                state = State.AFTER_COMMENT_CLOSING_DASH1;
            } else if (c == '>') {
                fatalError("Comment not wellformed");
                return;
            } else {
                // ignore
            }
            break;
        case AFTER_COMMENT_CLOSING_DASH1:
            // token must be -
            if (c == '-') {
                state = State.AFTER_COMMENT_CLOSING_DASH2;
            } else {
                fatalError("Comment not wellformed");
                return;
            }
            break;
        case AFTER_COMMENT_CLOSING_DASH2:
            // token must be >
            if (c == '>') {
                state = State.START;
            } else {
                fatalError("Comment not wellformed");
                return;
            }
            break;
        case IN_DECLARATION:
            // wait for >
            if (c == '>') {
                state = State.START;
            }
            break;
        }
    }