private string ReadString() { bool escaped = false; char quoteChar = NullChar; bool atStart = true; bool wasQuoted = false; uint braceCount = 0; // To be compat with v3 which allowed balanced {} inside of strings StringBuilder sb = new StringBuilder(); char ch; while (!IsAtEndOfInput) { ch = CurrentChar; // handle escaping and quoting first. if (escaped) { sb.Append('\\'); sb.Append(ch); escaped = false; } else if (quoteChar != NullChar) { if (ch == Backslash) { escaped = true; } else if (ch != quoteChar) { sb.Append(ch); } else { ch = CurrentChar; quoteChar = NullChar; break; // we are done. } } // If we are inside of MarkupExtensionBracketCharacters for a particular property or position parameter, // scoop up everything inside one by one, and keep track of nested Bracket Characters in the stack. else if (_context.CurrentBracketModeParseParameters != null && _context.CurrentBracketModeParseParameters.IsBracketEscapeMode) { Stack <char> bracketCharacterStack = _context.CurrentBracketModeParseParameters.BracketCharacterStack; if (_currentSpecialBracketCharacters.StartsEscapeSequence(ch)) { bracketCharacterStack.Push(ch); } else if (_currentSpecialBracketCharacters.EndsEscapeSequence(ch)) { if (_currentSpecialBracketCharacters.Match(bracketCharacterStack.Peek(), ch)) { bracketCharacterStack.Pop(); } else { throw new XamlParseException(this, SR.Get(SRID.InvalidClosingBracketCharacers, ch.ToString())); } } else if (ch == Backslash) { escaped = true; } if (bracketCharacterStack.Count == 0) { _context.CurrentBracketModeParseParameters.IsBracketEscapeMode = false; } if (!escaped) { sb.Append(ch); } } else { bool done = false; switch (ch) { case Space: if (_state == StringState.Type) { done = true; // we are done. break; } sb.Append(ch); break; case OpenCurlie: braceCount++; sb.Append(ch); break; case CloseCurlie: if (braceCount == 0) { done = true; } else { braceCount--; sb.Append(ch); } break; case Comma: done = true; // we are done. break; case EqualSign: _state = StringState.Property; done = true; // we are done. break; case Backslash: escaped = true; break; case Quote1: case Quote2: if (!atStart) { throw new XamlParseException(this, SR.Get(SRID.QuoteCharactersOutOfPlace)); } quoteChar = ch; wasQuoted = true; break; default: // All other character (including whitespace) if (_currentSpecialBracketCharacters != null && _currentSpecialBracketCharacters.StartsEscapeSequence(ch)) { Stack <char> bracketCharacterStack = _context.CurrentBracketModeParseParameters.BracketCharacterStack; bracketCharacterStack.Clear(); bracketCharacterStack.Push(ch); _context.CurrentBracketModeParseParameters.IsBracketEscapeMode = true; } sb.Append(ch); break; } if (done) { if (braceCount > 0) { throw new XamlParseException(this, SR.Get(SRID.UnexpectedTokenAfterME)); } else { if (_context.CurrentBracketModeParseParameters?.BracketCharacterStack.Count > 0) { throw new XamlParseException(this, SR.Get(SRID.MalformedBracketCharacters, ch.ToString())); } } PushBack(); break; // we are done. } } atStart = false; Advance(); } if (quoteChar != NullChar) { throw new XamlParseException(this, SR.Get(SRID.UnclosedQuote)); } string result = sb.ToString(); if (!wasQuoted) { result = result.TrimEnd(KnownStrings.WhitespaceChars); result = result.TrimStart(KnownStrings.WhitespaceChars); } if (_state == StringState.Property) { _currentParameterName = result; _currentSpecialBracketCharacters = GetBracketCharacterForProperty(_currentParameterName); } return(result); }
// Token: 0x060021BE RID: 8638 RVA: 0x000A86EC File Offset: 0x000A68EC private ArrayList TokenizeAttributes(string args, int lineNumber, int linePosition, Type extensionType) { if (extensionType == typeof(MarkupExtensionParser.UnknownMarkupExtension)) { return(null); } int num = 0; ParameterInfo[] array = this.FindLongestConstructor(extensionType, out num); Dictionary <string, SpecialBracketCharacters> dictionary = this._parserContext.InitBracketCharacterCacheForType(extensionType); Stack <char> stack = new Stack <char>(); int num2 = 0; bool flag = array != null && num > 0; bool flag2 = false; ArrayList arrayList = null; int length = args.Length; bool flag3 = false; bool flag4 = false; bool flag5 = false; bool flag6 = false; char c = '\''; int num3 = 0; StringBuilder stringBuilder = null; SpecialBracketCharacters specialBracketCharacters = null; if (flag && dictionary != null) { string text = (num > 0) ? array[num2].Name : null; if (!string.IsNullOrEmpty(text)) { specialBracketCharacters = this.GetBracketCharacterForProperty(text, dictionary); } } int num4 = 0; while (num4 < length && !flag6) { if (!flag4 && args[num4] == '\\') { flag4 = true; } else { if (!flag5 && !char.IsWhiteSpace(args[num4])) { flag5 = true; } if (flag3 || num3 > 0 || flag5) { if (stringBuilder == null) { stringBuilder = new StringBuilder(length); arrayList = new ArrayList(1); } if (flag4) { stringBuilder.Append('\\'); stringBuilder.Append(args[num4]); flag4 = false; } else if (flag3 || num3 > 0) { if (flag3 && args[num4] == c) { flag3 = false; flag5 = false; MarkupExtensionParser.AddToTokenList(arrayList, stringBuilder, false); } else { if (num3 > 0 && args[num4] == '}') { num3--; } else if (args[num4] == '{') { num3++; } stringBuilder.Append(args[num4]); } } else if (flag2) { stringBuilder.Append(args[num4]); if (specialBracketCharacters.StartsEscapeSequence(args[num4])) { stack.Push(args[num4]); } else if (specialBracketCharacters.EndsEscapeSequence(args[num4])) { if (specialBracketCharacters.Match(stack.Peek(), args[num4])) { stack.Pop(); } else { this.ThrowException("ParserMarkupExtensionInvalidClosingBracketCharacers", args[num4].ToString(), lineNumber, linePosition); } } if (stack.Count == 0) { flag2 = false; } } else { char c2 = args[num4]; if (c2 <= ',') { if (c2 == '"' || c2 == '\'') { if (stringBuilder.Length != 0) { this.ThrowException("ParserMarkupExtensionNoQuotesInName", args, lineNumber, linePosition); } flag3 = true; c = args[num4]; goto IL_441; } if (c2 != ',') { goto IL_405; } } else if (c2 != '=') { if (c2 == '{') { num3++; stringBuilder.Append(args[num4]); goto IL_441; } if (c2 != '}') { goto IL_405; } flag6 = true; if (stringBuilder == null) { goto IL_441; } if (stringBuilder.Length > 0) { MarkupExtensionParser.AddToTokenList(arrayList, stringBuilder, true); goto IL_441; } if (arrayList.Count > 0 && arrayList[arrayList.Count - 1] is char) { this.ThrowException("ParserMarkupExtensionBadDelimiter", args, lineNumber, linePosition); goto IL_441; } goto IL_441; } if (flag && args[num4] == ',') { flag = (++num2 < num); if (flag) { string text = array[num2].Name; specialBracketCharacters = this.GetBracketCharacterForProperty(text, dictionary); } } if (stringBuilder != null && stringBuilder.Length > 0) { MarkupExtensionParser.AddToTokenList(arrayList, stringBuilder, true); if (stack.Count != 0) { this.ThrowException("ParserMarkupExtensionMalformedBracketCharacers", stack.Peek().ToString(), lineNumber, linePosition); } } else if (arrayList.Count == 0) { this.ThrowException("ParserMarkupExtensionDelimiterBeforeFirstAttribute", args, lineNumber, linePosition); } else if (arrayList[arrayList.Count - 1] is char) { this.ThrowException("ParserMarkupExtensionBadDelimiter", args, lineNumber, linePosition); } if (args[num4] == '=') { flag = false; string text = (string)arrayList[arrayList.Count - 1]; specialBracketCharacters = this.GetBracketCharacterForProperty(text, dictionary); } arrayList.Add(args[num4]); flag5 = false; goto IL_441; IL_405: if (specialBracketCharacters != null && specialBracketCharacters.StartsEscapeSequence(args[num4])) { stack.Clear(); stack.Push(args[num4]); flag2 = true; } stringBuilder.Append(args[num4]); } } } IL_441: num4++; } if (!flag6) { this.ThrowException("ParserMarkupExtensionNoEndCurlie", "}", lineNumber, linePosition); } else if (num4 < length) { this.ThrowException("ParserMarkupExtensionTrailingGarbage", "}", args.Substring(num4, length - num4), lineNumber, linePosition); } return(arrayList); }