private static void MatchRange(string Source, int SourceLength, ref int SourceIndex, LigatureInfo[] SourceLigatureInfo, string Pattern, int PatternLength, ref int PatternIndex, LigatureInfo[] PatternLigatureInfo, ref bool RangePatternEmpty, ref bool Mismatch, ref bool PatternError, CompareInfo Comparer, CompareOptions Options, [Optional, DefaultParameterValue(false)] ref bool SeenNot, [Optional, DefaultParameterValue(null)] List <Range> RangeList, [Optional, DefaultParameterValue(false)] bool ValidatePatternWithoutMatching) { Range range; string str2; int num2 = 0; int num3 = 0; int num5; RangePatternEmpty = false; Mismatch = false; PatternError = false; SeenNot = false; PatternIndex++; if (PatternIndex >= PatternLength) { PatternError = true; return; } char ch = Pattern[PatternIndex]; switch ((uint)ch) { case '!': case 0xff01: SeenNot = true; PatternIndex++; if (PatternIndex >= PatternLength) { Mismatch = true; return; } ch = Pattern[PatternIndex]; break; } if ((ch == ']') || (ch == 0xff3d)) { if (SeenNot) { SeenNot = false; if (!ValidatePatternWithoutMatching) { Mismatch = CompareChars(Source[SourceIndex], '!', Comparer, Options) != 0; } if (RangeList != null) { range.Start = PatternIndex - 1; range.StartLength = 1; range.End = -1; range.EndLength = 0; RangeList.Add(range); } return; } RangePatternEmpty = true; return; } Label_00CE: str2 = null; string right = null; if ((ch == ']') || (ch == 0xff3d)) { Mismatch = !SeenNot; return; } if ((!ValidatePatternWithoutMatching && (PatternLigatureInfo != null)) && (PatternLigatureInfo[PatternIndex].Kind == CharKind.ExpandedChar1)) { if (CompareChars(Source, SourceLength, SourceIndex, ref num3, SourceLigatureInfo, Pattern, PatternLength, PatternIndex, ref num2, PatternLigatureInfo, Comparer, Options, true, false) != 0) { goto Label_0145; } SourceIndex = num3; PatternIndex = num2; goto Label_037F; } num2 = PatternIndex; SkipToEndOfExpandedChar(PatternLigatureInfo, PatternLength, ref num2); Label_0145: range.Start = PatternIndex; range.StartLength = (num2 - PatternIndex) + 1; if (Options == CompareOptions.Ordinal) { str2 = Conversions.ToString(Pattern[PatternIndex]); } else if ((PatternLigatureInfo != null) && (PatternLigatureInfo[PatternIndex].Kind == CharKind.ExpandedChar1)) { str2 = Conversions.ToString(PatternLigatureInfo[PatternIndex].CharBeforeExpansion); PatternIndex = num2; } else { str2 = Pattern.Substring(PatternIndex, (num2 - PatternIndex) + 1); PatternIndex = num2; } if ((((num2 + 2) >= PatternLength) || ((Pattern[num2 + 1] != '-') && (Pattern[num2 + 1] != 0xff0d))) || ((Pattern[num2 + 2] == ']') || (Pattern[num2 + 2] == 0xff3d))) { if (!ValidatePatternWithoutMatching) { num5 = 0; if (CompareChars(Source, SourceLength, SourceIndex, ref num3, SourceLigatureInfo, Pattern, range.Start + range.StartLength, range.Start, ref num5, PatternLigatureInfo, Comparer, Options, false, true) == 0) { goto Label_037F; } } range.End = -1; range.EndLength = 0; goto Label_0409; } PatternIndex += 2; if ((!ValidatePatternWithoutMatching && (PatternLigatureInfo != null)) && (PatternLigatureInfo[PatternIndex].Kind == CharKind.ExpandedChar1)) { if (CompareChars(Source, SourceLength, SourceIndex, ref num3, SourceLigatureInfo, Pattern, PatternLength, PatternIndex, ref num2, PatternLigatureInfo, Comparer, Options, true, false) != 0) { goto Label_0279; } PatternIndex = num2; goto Label_037F; } num2 = PatternIndex; SkipToEndOfExpandedChar(PatternLigatureInfo, PatternLength, ref num2); Label_0279: range.End = PatternIndex; range.EndLength = (num2 - PatternIndex) + 1; if (Options == CompareOptions.Ordinal) { right = Conversions.ToString(Pattern[PatternIndex]); } else if ((PatternLigatureInfo != null) && (PatternLigatureInfo[PatternIndex].Kind == CharKind.ExpandedChar1)) { right = Conversions.ToString(PatternLigatureInfo[PatternIndex].CharBeforeExpansion); PatternIndex = num2; } else { right = Pattern.Substring(PatternIndex, (num2 - PatternIndex) + 1); PatternIndex = num2; } if (CompareChars(str2, right, Comparer, Options) > 0) { PatternError = true; return; } if (ValidatePatternWithoutMatching) { goto Label_0409; } int rightEnd = 0; if (CompareChars(Source, SourceLength, SourceIndex, ref num3, SourceLigatureInfo, Pattern, range.Start + range.StartLength, range.Start, ref rightEnd, PatternLigatureInfo, Comparer, Options, false, true) < 0) { goto Label_0409; } num5 = 0; if (CompareChars(Source, SourceLength, SourceIndex, ref num3, SourceLigatureInfo, Pattern, range.End + range.EndLength, range.End, ref num5, PatternLigatureInfo, Comparer, Options, false, true) > 0) { goto Label_0409; } Label_037F: if (SeenNot) { Mismatch = true; return; } do { PatternIndex++; if (PatternIndex >= PatternLength) { PatternError = true; return; } }while ((Pattern[PatternIndex] != ']') && (Pattern[PatternIndex] != 0xff3d)); SourceIndex = num3; return; Label_0409: if (RangeList != null) { RangeList.Add(range); } PatternIndex++; if (PatternIndex >= PatternLength) { PatternError = true; } else { ch = Pattern[PatternIndex]; goto Label_00CE; } }