{
int startOffset = _is.getOffset();
boolean isEBCDIC = false;
int ch = _is.read();
XmlReader reader = null;
// utf-16 starts with \xfe \xff
if (ch == 0xfe) {
ch = _is.read();
if (ch == 0xff) {
_owner.setAttribute("encoding", "UTF-16");
_is.setEncoding("utf-16");
reader = new Utf16Reader(this, _is);
ch = reader.read();
}
}
// utf-16 rev starts with \xff \xfe
else if (ch == 0xff) {
ch = _is.read();
if (ch == 0xfe) {
_owner.setAttribute("encoding", "UTF-16");
_is.setEncoding("utf-16");
reader = new Utf16Reader(this, _is);
((Utf16Reader) reader).setReverse(true);
ch = reader.read();
}
}
// utf-16 can also start with \x00 <
else if (ch == 0x00) {
ch = _is.read();
_owner.setAttribute("encoding", "UTF-16");
_is.setEncoding("utf-16");
reader = new Utf16Reader(this, _is);
}
// utf-8 BOM is \xef \xbb \xbf
else if (ch == 0xef) {
ch = _is.read();
if (ch == 0xbb) {
ch = _is.read();
if (ch == 0xbf) {
ch = _is.read();
_owner.setAttribute("encoding", "UTF-8");
_is.setEncoding("utf-8");
reader = new Utf8Reader(this, _is);
}
}
}
else if (ch == 0x4c) {
// ebcdic
// xml/00l1
_is.unread();
// _is.setEncoding("cp037");
_is.setEncoding("cp500");
isEBCDIC = true;
reader = new XmlReader(this, _is);
ch = reader.read();
}
else {
int ch2 = _is.read();
if (ch2 == 0x00) {
_owner.setAttribute("encoding", "UTF-16LE");
_is.setEncoding("utf-16le");
reader = new Utf16Reader(this, _is);
((Utf16Reader) reader).setReverse(true);
}
else if (ch2 > 0)
_is.unread();
}
if (reader != null && reader != oldReader) {
}
else if (_is.getSource() instanceof ReaderWriterStream) {
reader = new XmlReader(this, _is);
}
else {
reader = new Utf8Reader(this, _is);
}
if (ch == '\n')
reader.setLine(2);
reader.setSystemId(_systemId);
if (_systemId == null)
reader.setSystemId(_filename);
reader.setFilename(_filename);
reader.setPublicId(_publicId);
reader.setNext(oldReader);
_reader = reader;
/* XXX: this might be too strict. */
/*