System.Data.LikeNode.AnalyzePattern C# (CSharp) Method

AnalyzePattern() private method

private AnalyzePattern ( string pat ) : string
pat string
return string
        internal string AnalyzePattern(string pat)
        {
            int length = pat.Length;
            char[] patchars = new char[length + 1];
            pat.CopyTo(0, patchars, 0, length);
            patchars[length] = (char)0;
            string substring = null;

            char[] constchars = new char[length + 1];
            int newLength = 0;

            int stars = 0;

            int i = 0;

            while (i < length)
            {
                if (patchars[i] == '*' || patchars[i] == '%')
                {
                    // replace conseq. * or % with one..
                    while ((patchars[i] == '*' || patchars[i] == '%') && i < length)
                        i++;

                    // we allowing only *str* pattern
                    if ((i < length && newLength > 0) || stars >= 2)
                    {
                        // we have a star inside string constant..
                        throw ExprException.InvalidPattern(pat);
                    }
                    stars++;
                }
                else if (patchars[i] == '[')
                {
                    i++;
                    if (i >= length)
                    {
                        throw ExprException.InvalidPattern(pat);
                    }
                    constchars[newLength++] = patchars[i++];

                    if (i >= length)
                    {
                        throw ExprException.InvalidPattern(pat);
                    }

                    if (patchars[i] != ']')
                    {
                        throw ExprException.InvalidPattern(pat);
                    }
                    i++;
                }
                else
                {
                    constchars[newLength++] = patchars[i];
                    i++;
                }
            }

            substring = new string(constchars, 0, newLength);

            if (stars == 0)
            {
                _kind = match_exact;
            }
            else
            {
                if (newLength > 0)
                {
                    if (patchars[0] == '*' || patchars[0] == '%')
                    {
                        if (patchars[length - 1] == '*' || patchars[length - 1] == '%')
                        {
                            _kind = match_middle;
                        }
                        else
                        {
                            _kind = match_right;
                        }
                    }
                    else
                    {
                        Debug.Assert(patchars[length - 1] == '*' || patchars[length - 1] == '%', "Invalid LIKE pattern formed.. ");
                        _kind = match_left;
                    }
                }
                else
                {
                    _kind = match_all;
                }
            }
            return substring;
        }
    }