bool RegExpMatch()

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