private int DetermineFormat(TokenizerStream stream) { if (stream.GetNextToken() == Tokenizer.bra) { if (stream.GetNextToken() == Tokenizer.quest) { _t.GetTokens(stream, -1, true); stream.GoToPosition(2); bool sawEquals = false; bool sawEncoding = false; short i; for (i = stream.GetNextToken(); i != -1 && i != Tokenizer.ket; i = stream.GetNextToken()) { switch (i) { case Tokenizer.cstr: if (sawEquals && sawEncoding) { _t.ChangeFormat(System.Text.Encoding.GetEncoding(stream.GetNextString())); return(0); } else if (!sawEquals) { if (String.Compare(stream.GetNextString(), "encoding", StringComparison.Ordinal) == 0) { sawEncoding = true; } } else { sawEquals = false; sawEncoding = false; stream.ThrowAwayNextString(); } break; case Tokenizer.equals: sawEquals = true; break; default: throw new XmlSyntaxException("XMLSyntax_UnexpectedEndOfFile"); } } return(0); } } return(2); }
private void GetRequiredSizes(TokenizerStream stream, ref int index) { bool needToBreak = false; bool needToPop = false; bool createdNode = false; bool intag = false; int stackDepth = 1; SecurityElementType type = SecurityElementType.Regular; String strValue = null; bool sawEquals = false; bool sawText = false; int status = 0; short i; do { for (i = stream.GetNextToken(); i != -1; i = stream.GetNextToken()) { switch (i & 0x00FF) { case Tokenizer.cstr: { if (intag) { if (type == SecurityElementType.Comment) { // Ignore data in comments but still get the data // to keep the stream in the right place. stream.ThrowAwayNextString(); stream.TagLastToken(c_wastedstringtag); } else { // We're in a regular tag, so we've found an attribute/value pair. if (strValue == null) { // Found attribute name, save it for later. strValue = stream.GetNextString(); } else { // Found attribute text, add the pair to the current element. if (!sawEquals) { throw new XmlSyntaxException(_t.LineNo); } stream.TagLastToken(c_attributetag); index += SecurityDocument.EncodedStringSize(strValue) + SecurityDocument.EncodedStringSize(stream.GetNextString()) + 1; strValue = null; sawEquals = false; } } } else { // We're not in a tag, so we've found text between tags. if (sawText) { stream.TagLastToken(c_additionaltexttag); index += SecurityDocument.EncodedStringSize(stream.GetNextString()) + SecurityDocument.EncodedStringSize(" "); } else { stream.TagLastToken(c_texttag); index += SecurityDocument.EncodedStringSize(stream.GetNextString()) + 1; sawText = true; } } } break; case Tokenizer.bra: intag = true; sawText = false; i = stream.GetNextToken(); if (i == Tokenizer.slash) { stream.TagLastToken(c_childrentag); while (true) { // spin; don't care what's in here i = stream.GetNextToken(); if (i == Tokenizer.cstr) { stream.ThrowAwayNextString(); stream.TagLastToken(c_wastedstringtag); } else if (i == -1) { throw new XmlSyntaxException("XMLSyntax_UnexpectedEndOfFile"); } else { break; } } if (i != Tokenizer.ket) { throw new XmlSyntaxException("XMLSyntax_ExpectedCloseBracket"); } intag = false; // Found the end of this element index++; sawText = false; stackDepth--; needToBreak = true; } else if (i == Tokenizer.cstr) { // Found a child createdNode = true; stream.TagLastToken(c_elementtag); index += SecurityDocument.EncodedStringSize(stream.GetNextString()) + 1; if (type != SecurityElementType.Regular) { throw new XmlSyntaxException(_t.LineNo); } needToBreak = true; stackDepth++; } else if (i == Tokenizer.bang) { // Found a child that is a comment node. Next up better be a cstr. status = 1; do { i = stream.GetNextToken(); switch (i) { case Tokenizer.bra: status++; break; case Tokenizer.ket: status--; break; case Tokenizer.cstr: stream.ThrowAwayNextString(); stream.TagLastToken(c_wastedstringtag); break; default: break; } } while (status > 0); intag = false; sawText = false; needToBreak = true; } else if (i == Tokenizer.quest) { // Found a child that is a format node. Next up better be a cstr. i = stream.GetNextToken(); if (i != Tokenizer.cstr) { throw new XmlSyntaxException(_t.LineNo); } createdNode = true; type = SecurityElementType.Format; stream.TagLastToken(c_elementtag); index += SecurityDocument.EncodedStringSize(stream.GetNextString()) + 1; status = 1; stackDepth++; needToBreak = true; } else { throw new XmlSyntaxException("XMLSyntax_ExpectedSlashOrString"); } break; case Tokenizer.equals: sawEquals = true; break; case Tokenizer.ket: if (intag) { intag = false; continue; } else { throw new XmlSyntaxException("XMLSyntax_UnexpectedCloseBracket"); } // not reachable case Tokenizer.slash: i = stream.GetNextToken(); if (i == Tokenizer.ket) { // Found the end of this element stream.TagLastToken(c_childrentag); index++; stackDepth--; sawText = false; needToBreak = true; } else { throw new XmlSyntaxException("XMLSyntax_ExpectedCloseBracket"); } break; case Tokenizer.quest: if (intag && type == SecurityElementType.Format && status == 1) { i = stream.GetNextToken(); if (i == Tokenizer.ket) { stream.TagLastToken(c_childrentag); index++; stackDepth--; sawText = false; needToBreak = true; } else { throw new XmlSyntaxException("XMLSyntax_ExpectedCloseBracket"); } } else { throw new XmlSyntaxException(_t.LineNo); } break; case Tokenizer.dash: default: throw new XmlSyntaxException(_t.LineNo); } if (needToBreak) { needToBreak = false; needToPop = false; break; } else { needToPop = true; } } if (needToPop) { index++; stackDepth--; sawText = false; } else if (i == -1 && (stackDepth != 1 || !createdNode)) { // This means that we still have items on the stack, but the end of our // stream has been reached. throw new XmlSyntaxException("XMLSyntax_UnexpectedEndOfFile"); } }while (stackDepth > 1); }