private final int doNext() throws IOException {
		if (m_tagType==END_DOCUMENT) {
			return END_DOCUMENT;
		}
		
		m_tagType=(ReadUtil.readInt(m_stream) & 0xFF);/*other 3 bytes?*/
		/*some source length*/ReadUtil.readInt(m_stream);
		m_tagSourceLine=ReadUtil.readInt(m_stream);
		/*0xFFFFFFFF*/ReadUtil.readInt(m_stream);

		m_tagName=-1;
		m_tagAttributes=null;

		switch (m_tagType) {
			case START_DOCUMENT:
			{
				/*namespace?*/ReadUtil.readInt(m_stream);
				/*name?*/ReadUtil.readInt(m_stream);
				break;
			}
			case START_TAG:
			{
				/*0xFFFFFFFF*/ReadUtil.readInt(m_stream);
				m_tagName=ReadUtil.readInt(m_stream);
				/*flags?*/ReadUtil.readInt(m_stream);
				int attributeCount=ReadUtil.readInt(m_stream);
				/*?*/ReadUtil.readInt(m_stream);
				m_tagAttributes=new TagAttribute[attributeCount];
				for (int i=0;i!=attributeCount;++i) {
					TagAttribute attribute=new TagAttribute();
					attribute.namespace=ReadUtil.readInt(m_stream);
					attribute.name=ReadUtil.readInt(m_stream);
					attribute.valueString=ReadUtil.readInt(m_stream);
					attribute.valueType=(ReadUtil.readInt(m_stream)>>>24);/*other 3 bytes?*/
					attribute.value=ReadUtil.readInt(m_stream);
					m_tagAttributes[i]=attribute;
				}
				break;
			}
			case END_TAG:
			{
				/*0xFFFFFFFF*/ReadUtil.readInt(m_stream);
				m_tagName=ReadUtil.readInt(m_stream);
				break;
			}
			case TEXT:
			{
				m_tagName=ReadUtil.readInt(m_stream);
				/*?*/ReadUtil.readInt(m_stream);
				/*?*/ReadUtil.readInt(m_stream);
				break;
			}
			case END_DOCUMENT:
			{
				/*namespace?*/ReadUtil.readInt(m_stream);
				/*name?*/ReadUtil.readInt(m_stream);
				break;
			}
			default:
			{
				throw new IOException("Invalid tag type ("+m_tagType+").");
			}
		}
		return m_tagType;
	}