private static int FindMatchLength(string source, string searchValue, int searchIndex, int searchLength, StringComparison comparisonType, int matchIndex)
        {
            int matchLengthMaximum = searchLength - (matchIndex - searchIndex);
            int matchLengthInitial = Math.Min(searchValue.Length, matchLengthMaximum);

            // Hot path: match length is same as specified search string
            if (Substring.CompareInner(source, matchIndex, matchLengthInitial, searchValue, 0, searchValue.Length, comparisonType) == 0)
            {
                return(matchLengthInitial);
            }

            int matchLengthDecrementing = matchLengthInitial - 1;
            int matchLengthIncrementing = matchLengthInitial + 1;

            while (matchLengthDecrementing >= 0 || matchLengthIncrementing <= matchLengthMaximum)
            {
                if (matchLengthDecrementing >= 0)
                {
                    if (Substring.CompareInner(source, matchIndex, matchLengthDecrementing, searchValue, 0, searchValue.Length, comparisonType) == 0)
                    {
                        return(matchLengthDecrementing);
                    }

                    matchLengthDecrementing--;
                }

                if (matchLengthIncrementing <= matchLengthMaximum)
                {
                    if (Substring.CompareInner(source, matchIndex, matchLengthIncrementing, searchValue, 0, searchValue.Length, comparisonType) == 0)
                    {
                        return(matchLengthIncrementing);
                    }

                    matchLengthIncrementing++;
                }
            }

            // Should never happen
            return(-1);
        }