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;
}
}