in host/common/portablehelpers.cpp [586:671]
bool RegExpMatch(const char *srchptrn, const char *input)
{
char *p;
char t;
const char *ps;
char c;
for (ps = input;;)
{
switch (c = *srchptrn++)
{
case '\0':
return (*input == '\0');
case '?':
if (*input == '\0')
{
return false;
}
if ((*input == '.') && (input == ps))
{
return false;
}
++input;
break;
case '*':
c = *srchptrn;
while (c == '*')
{
c = *++srchptrn;
}
if ((*input == '.') && (input == ps))
{
return false;
}
if (c == '\0')
{
return true;
}
while ((t = *input) != '\0')
{
if (RegExpMatch(srchptrn, input))
{
return true;
}
++input;
}
return false;
case '[':
if (*input == '\0')
{
return false;
}
if ((*input == '.') && (input == ps))
{
return false;
}
switch (DoesRegExpRangeMatch(srchptrn, *input,&p))
{
case -1:
goto regular;
case 1:
srchptrn = p;
break;
case 0:
return false;
}
++input;
break;
case '\\':
if ((c = *srchptrn++) == '\0')
{
c = '\\';
--srchptrn;
}
default:
regular:
/* The regular string */
if (c != *input )
{
return false;
}
++input;
break;
}
}
}