in nbxml/src/main/java/org/apache/vysper/xml/sax/impl/XMLTokenizer.java [62:137]
public void parse(IoBuffer byteBuffer, CharsetDecoder decoder) throws SAXException {
while (byteBuffer.hasRemaining() && state != State.CLOSED) {
byte c = byteBuffer.get();
if (state == State.START) {
if (c == '<') {
emit(c);
state = State.IN_TAG;
} else if (Character.isWhitespace(c)) {
// ignore
} else {
state = State.IN_TEXT;
buffer.put(c);
}
} else if (state == State.IN_TEXT) {
if (c == '<') {
emit(decoder);
emit(c);
state = State.IN_TAG;
} else {
buffer.put(c);
}
} else if (state == State.IN_TAG) {
if (c == '>') {
emit(c);
state = State.START;
} else if (c == '"') {
emit(c);
state = State.IN_DOUBLE_ATTRIBUTE_VALUE;
} else if (c == '\'') {
emit(c);
state = State.IN_SINGLE_ATTRIBUTE_VALUE;
} else if (c == '-') {
emit(c);
} else if (isControlChar(c)) {
emit(c);
} else if (Character.isWhitespace(c)) {
buffer.clear();
} else {
state = State.IN_STRING;
buffer.put(c);
}
} else if (state == State.IN_STRING) {
if (c == '>') {
emit(CharsetUtil.getDecoder());
emit(c);
state = State.START;
} else if (isControlChar(c)) {
emit(CharsetUtil.getDecoder());
emit(c);
state = State.IN_TAG;
} else if (Character.isWhitespace(c)) {
emit(CharsetUtil.getDecoder());
state = State.IN_TAG;
} else {
buffer.put(c);
}
} else if (state == State.IN_DOUBLE_ATTRIBUTE_VALUE) {
if (c == '"') {
emit(decoder);
emit(c);
state = State.IN_TAG;
} else {
buffer.put(c);
}
} else if (state == State.IN_SINGLE_ATTRIBUTE_VALUE) {
if (c == '\'') {
emit(decoder);
emit(c);
state = State.IN_TAG;
} else {
buffer.put(c);
}
}
}
}