mini-httpd源码分析-match.h

//字符串匹配,匹配返回 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;

}

 

你可能感兴趣的:(httpd)