11 April, 2009

Wildcard comparer

Все наверное писали что-то подобное на тестах при поступлении на работу. И вот свершилось, wildcard comparer реально потребовался. Особенности алгоритма: несколько следующих друг за другом * считаются одной.
bool WildcardCompare(LPCWSTR pFilter, LPCWSTR pString)
{
    while (*pString && *pFilter != L'*')
    {
        if (*pFilter != *pString && *pFilter != L'?')
            return false;
 
        ++pFilter;
        ++pString;
    }
 
    LPCWSTR pBaseFilter;
    LPCWSTR pBaseString;
 
    while (*pString)
    {
        if (*pFilter == L'*')
        {
            if (!*++pFilter)
                return true;
 
            pBaseFilter = pFilter;
            pBaseString = pString;
        }
        else if (*pFilter == *pString || *pFilter == L'?')
        {
            ++pFilter;
            ++pString;
        }
        else
        {
            pFilter = pBaseFilter;
            pString = ++pBaseString;
        }
    }
 
    while (*pFilter == L'*')
        ++pFilter;
 
    return !*pFilter;
}

No comments: