首页 > 技术文章 > mini-httpd源码分析-match.h

jokoz 2015-06-17 14:27 原文

//字符串匹配,匹配返回 1,否则返回 0.

//pattern可以通过任意个 | 字符,组合match_one中pattern的功能
int
match(const char* pattern, const char* string)
{
    const char* or;

    for (;;)
    {
        or = strchr(pattern, '|');
        if (or == (char*)0)
            return match_one(pattern, strlen(pattern), string);
        if (match_one(pattern, or - pattern, string))
            return 1;
        pattern = or + 1;
    }
}

/*    对于pattern中的字符:
        ?:匹配任意单个字符
        **:匹配任意长度字符串
        *:匹配任意长度字符串,直到遇到 /
*/
static int
match_one(const char* pattern, int patternlen, const char* string)
{
    const char* p;

    for (p = pattern; p - pattern < patternlen; ++p, ++string)
    {
        if (*p == '?' && *string != '\0')
            continue;
        if (*p == '*')
        {
            int i, pl;
            ++p;
            if (*p == '*')
            {
                /* Double-wildcard matches anything. */
                ++p;
                i = strlen(string);
            }
            else
                /* Single-wildcard matches anything but slash. */
                i = strcspn(string, "/");
            pl = patternlen - (p - pattern);
            for (; i >= 0; --i)
                if (match_one(p, pl, &(string[i])))
                    return 1;
            return 0;
        }
        if (*p != *string)
            return 0;
    }
    if (*string == '\0')
        return 1;
    return 0;
}

 

推荐阅读