Exemple #1
0
        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;
            }
        }